Skip to content

Commit 627aaa6

Browse files
committed
parser: reduce code duplication
Signed-off-by: Yerden Zhumabekov <[email protected]>
1 parent c227e91 commit 627aaa6

File tree

1 file changed

+71
-87
lines changed

1 file changed

+71
-87
lines changed

parser.go

Lines changed: 71 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ func LayersDecoder(dl DecodingLayerContainer, first LayerType, df DecodeFeedback
7777
}
7878
}
7979

80-
return func(data []byte, decoded *[]LayerType) (LayerType, error) {
81-
if len(data) > 0 {
80+
if dlc, ok := dl.(DecodingLayerSparse); ok {
81+
return func(data []byte, decoded *[]LayerType) (LayerType, error) {
8282
*decoded = (*decoded)[:0] // Truncated decoded layers.
8383
typ := first
8484
decoder := firstDec
@@ -91,10 +91,75 @@ func LayersDecoder(dl DecodingLayerContainer, first LayerType, df DecodeFeedback
9191
if data = decoder.LayerPayload(); len(data) == 0 {
9292
break
9393
}
94-
if decoder, ok = dl.Decoder(typ); !ok {
94+
if decoder, ok = dlc.Decoder(typ); !ok {
9595
return typ, nil
9696
}
9797
}
98+
return LayerTypeZero, nil
99+
}
100+
}
101+
102+
if dlc, ok := dl.(DecodingLayerMap); ok {
103+
return func(data []byte, decoded *[]LayerType) (LayerType, error) {
104+
*decoded = (*decoded)[:0] // Truncated decoded layers.
105+
typ := first
106+
decoder := firstDec
107+
for {
108+
if err := decoder.DecodeFromBytes(data, df); err != nil {
109+
return LayerTypeZero, err
110+
}
111+
*decoded = append(*decoded, typ)
112+
typ = decoder.NextLayerType()
113+
if data = decoder.LayerPayload(); len(data) == 0 {
114+
break
115+
}
116+
if decoder, ok = dlc.Decoder(typ); !ok {
117+
return typ, nil
118+
}
119+
}
120+
return LayerTypeZero, nil
121+
}
122+
}
123+
124+
if dlc, ok := dl.(DecodingLayerArray); ok {
125+
return func(data []byte, decoded *[]LayerType) (LayerType, error) {
126+
*decoded = (*decoded)[:0] // Truncated decoded layers.
127+
typ := first
128+
decoder := firstDec
129+
for {
130+
if err := decoder.DecodeFromBytes(data, df); err != nil {
131+
return LayerTypeZero, err
132+
}
133+
*decoded = append(*decoded, typ)
134+
typ = decoder.NextLayerType()
135+
if data = decoder.LayerPayload(); len(data) == 0 {
136+
break
137+
}
138+
if decoder, ok = dlc.Decoder(typ); !ok {
139+
return typ, nil
140+
}
141+
}
142+
return LayerTypeZero, nil
143+
}
144+
}
145+
146+
// fallback implementation
147+
return func(data []byte, decoded *[]LayerType) (LayerType, error) {
148+
*decoded = (*decoded)[:0] // Truncated decoded layers.
149+
typ := first
150+
decoder := firstDec
151+
for {
152+
if err := decoder.DecodeFromBytes(data, df); err != nil {
153+
return LayerTypeZero, err
154+
}
155+
*decoded = append(*decoded, typ)
156+
typ = decoder.NextLayerType()
157+
if data = decoder.LayerPayload(); len(data) == 0 {
158+
break
159+
}
160+
if decoder, ok = dl.Decoder(typ); !ok {
161+
return typ, nil
162+
}
98163
}
99164
return LayerTypeZero, nil
100165
}
@@ -128,34 +193,7 @@ func (dl DecodingLayerSparse) Put(d DecodingLayer) DecodingLayerContainer {
128193

129194
// LayersDecoder implements DecodingLayerContainer interface.
130195
func (dl DecodingLayerSparse) LayersDecoder(first LayerType, df DecodeFeedback) DecodingLayerFunc {
131-
firstDec, ok := dl.Decoder(first)
132-
if !ok {
133-
return func([]byte, *[]LayerType) (LayerType, error) {
134-
return first, nil
135-
}
136-
}
137-
138-
return func(data []byte, decoded *[]LayerType) (LayerType, error) {
139-
if len(data) > 0 {
140-
*decoded = (*decoded)[:0] // Truncated decoded layers.
141-
typ := first
142-
decoder := firstDec
143-
for {
144-
if err := decoder.DecodeFromBytes(data, df); err != nil {
145-
return LayerTypeZero, err
146-
}
147-
*decoded = append(*decoded, typ)
148-
typ = decoder.NextLayerType()
149-
if data = decoder.LayerPayload(); len(data) == 0 {
150-
break
151-
}
152-
if decoder, ok = dl.Decoder(typ); !ok {
153-
return typ, nil
154-
}
155-
}
156-
}
157-
return LayerTypeZero, nil
158-
}
196+
return LayersDecoder(dl, first, df)
159197
}
160198

161199
// Decoder implements DecodingLayerContainer interface.
@@ -199,34 +237,7 @@ func (dl DecodingLayerArray) Decoder(typ LayerType) (DecodingLayer, bool) {
199237

200238
// LayersDecoder implements DecodingLayerContainer interface.
201239
func (dl DecodingLayerArray) LayersDecoder(first LayerType, df DecodeFeedback) DecodingLayerFunc {
202-
firstDec, ok := dl.Decoder(first)
203-
if !ok {
204-
return func([]byte, *[]LayerType) (LayerType, error) {
205-
return first, nil
206-
}
207-
}
208-
209-
return func(data []byte, decoded *[]LayerType) (LayerType, error) {
210-
if len(data) > 0 {
211-
*decoded = (*decoded)[:0] // Truncated decoded layers.
212-
typ := first
213-
decoder := firstDec
214-
for {
215-
if err := decoder.DecodeFromBytes(data, df); err != nil {
216-
return LayerTypeZero, err
217-
}
218-
*decoded = append(*decoded, typ)
219-
typ = decoder.NextLayerType()
220-
if data = decoder.LayerPayload(); len(data) == 0 {
221-
break
222-
}
223-
if decoder, ok = dl.Decoder(typ); !ok {
224-
return typ, nil
225-
}
226-
}
227-
}
228-
return LayerTypeZero, nil
229-
}
240+
return LayersDecoder(dl, first, df)
230241
}
231242

232243
// DecodingLayerMap is an map-based implementation of
@@ -253,34 +264,7 @@ func (dl DecodingLayerMap) Decoder(typ LayerType) (DecodingLayer, bool) {
253264

254265
// LayersDecoder implements DecodingLayerContainer interface.
255266
func (dl DecodingLayerMap) LayersDecoder(first LayerType, df DecodeFeedback) DecodingLayerFunc {
256-
firstDec, ok := dl.Decoder(first)
257-
if !ok {
258-
return func([]byte, *[]LayerType) (LayerType, error) {
259-
return first, nil
260-
}
261-
}
262-
263-
return func(data []byte, decoded *[]LayerType) (LayerType, error) {
264-
if len(data) > 0 {
265-
*decoded = (*decoded)[:0] // Truncated decoded layers.
266-
typ := first
267-
decoder := firstDec
268-
for {
269-
if err := decoder.DecodeFromBytes(data, df); err != nil {
270-
return LayerTypeZero, err
271-
}
272-
*decoded = append(*decoded, typ)
273-
typ = decoder.NextLayerType()
274-
if data = decoder.LayerPayload(); len(data) == 0 {
275-
break
276-
}
277-
if decoder, ok = dl.Decoder(typ); !ok {
278-
return typ, nil
279-
}
280-
}
281-
}
282-
return LayerTypeZero, nil
283-
}
267+
return LayersDecoder(dl, first, df)
284268
}
285269

286270
// Static code check.

0 commit comments

Comments
 (0)