@@ -62,11 +62,11 @@ func DecodePrimitive(typ types.Type, buf []byte) (interface{}, error) {
6262}
6363
6464// DecodeTupleGeneric: decode a []any from the current position in a SeqGetAccess.
65- func DecodeTupleGeneric (seq * SeqGetAccess , root bool ) ([]any , error ) {
65+ // If root is true, the caller already consumed the tuple header.
66+ // If ordered is true, maps inside the tuple are decoded as *types.OrderedMapAny.
67+ func DecodeTupleGeneric (seq * SeqGetAccess , root bool , ordered bool ) ([]any , error ) {
6668 nested := seq
67- pos := 0
6869 if ! root {
69-
7070 pos := seq .CurrentIndex ()
7171 typ , width , err := seq .PeekTypeWidth ()
7272 if err != nil {
@@ -82,57 +82,66 @@ func DecodeTupleGeneric(seq *SeqGetAccess, root bool) ([]any, error) {
8282 }
8383 return nil , nil
8484 }
85-
8685 nested , err = seq .PeekNestedSeq ()
8786 if err != nil {
8887 return nil , fmt .Errorf ("DecodeTuple: nested peek failed at pos %d: %w" , pos , err )
8988 }
9089 }
90+
9191 out := make ([]any , 0 , nested .ArgCount ())
9292 for i := 0 ; i < nested .ArgCount (); i ++ {
9393 valTyp , _ , err := nested .PeekTypeWidth ()
94-
9594 if err != nil {
96- return nil , fmt .Errorf ("DecodeMapAny: nested value decode error at %d: %w" , i + 1 , err )
97-
95+ return nil , fmt .Errorf ("DecodeTuple: nested value peek error at %d: %w" , i , err )
9896 }
9997 switch valTyp {
10098 case types .TypeMap :
101- v , err := DecodeMapAny (nested ) // delegate
99+ var v any
100+ if ordered {
101+ v , err = DecodeOrderedMapAny (nested )
102+ } else {
103+ v , err = DecodeMapAny (nested )
104+ }
102105 if err != nil {
103- return nil , fmt .Errorf ("DecodeMapAny : nested value decode error at %d: %w" , i + 1 , err )
106+ return nil , fmt .Errorf ("DecodeTuple : nested map decode error at %d: %w" , i , err )
104107 }
105108 out = append (out , v )
109+
106110 case types .TypeTuple :
107- v , err := DecodeTuple (nested ) // delegate
111+ v , err := DecodeTuple (nested )
108112 if err != nil {
109- return nil , fmt .Errorf ("DecodeMapAny : nested value decode error at %d: %w" , i + 1 , err )
113+ return nil , fmt .Errorf ("DecodeTuple : nested tuple decode error at %d: %w" , i , err )
110114 }
111115 out = append (out , v )
116+
112117 default :
113118 valPayload , valTyp , err := nested .Next ()
114119 if err != nil {
115- return nil , fmt .Errorf ("DecodeMapAny : nested value decode error at %d: %w" , i + 1 , err )
120+ return nil , fmt .Errorf ("DecodeTuple : nested value next error at %d: %w" , i , err )
116121 }
117122 v , err := DecodePrimitive (valTyp , valPayload )
118-
119123 if err != nil {
120- return nil , fmt .Errorf ("DecodeMapAny: nested value decode error at %d: %w" , i + 1 , err )
124+ return nil , fmt .Errorf ("DecodeTuple: primitive decode error at %d: %w" , i , err )
121125 }
122126 out = append (out , v )
123127 }
124-
125128 }
129+
126130 if ! root {
127131 if err := seq .Advance (); err != nil {
128- return nil , fmt .Errorf ("DecodeTuple: advance failed at pos %d : %w" , pos , err )
132+ return nil , fmt .Errorf ("DecodeTuple: advance failed: %w" , err )
129133 }
130134 }
131135 return out , nil
132136}
133137
138+ // Convenience wrappers
134139func DecodeTuple (seq * SeqGetAccess ) ([]any , error ) {
135- return DecodeTupleGeneric (seq , false )
140+ return DecodeTupleGeneric (seq , false , false )
141+ }
142+
143+ func DecodeTupleOrdered (seq * SeqGetAccess ) ([]any , error ) {
144+ return DecodeTupleGeneric (seq , false , true )
136145}
137146
138147// DecodeMapAny: decode a map[string]any from the current position in a SeqGetAccess.
@@ -208,15 +217,91 @@ func DecodeMapAny(seq *SeqGetAccess) (map[string]any, error) {
208217 return out , nil
209218}
210219
220+ // DecodeOrderedMapAny decodes a map from the sequence into an OrderedMapAny,
221+ // preserving insertion order of keys.
222+ func DecodeOrderedMapAny (seq * SeqGetAccess ) (* types.OrderedMapAny , error ) {
223+ pos := seq .CurrentIndex ()
224+ typ , width , err := seq .PeekTypeWidth ()
225+ if err != nil {
226+ return nil , fmt .Errorf ("DecodeOrderedMapAny: peek failed at pos %d: %w" , pos , err )
227+ }
228+ if typ != types .TypeMap {
229+ return nil , fmt .Errorf ("DecodeOrderedMapAny: type mismatch at pos %d — expected %v, got %v" , pos , types .TypeMap , typ )
230+ }
231+ if width == 0 {
232+ // nil/empty map
233+ if err := seq .Advance (); err != nil {
234+ return nil , fmt .Errorf ("DecodeOrderedMapAny: advance failed at pos %d: %w" , pos , err )
235+ }
236+ return nil , nil
237+ }
238+
239+ nested , err := seq .PeekNestedSeq ()
240+ if err != nil {
241+ return nil , fmt .Errorf ("DecodeOrderedMapAny: nested peek failed at pos %d: %w" , pos , err )
242+ }
243+
244+ out := types .NewOrderedMapAny ()
245+ for i := 0 ; i < nested .ArgCount (); i += 2 {
246+ // key
247+ keyPayload , keyTyp , err := nested .Next ()
248+ if err != nil {
249+ return nil , fmt .Errorf ("DecodeOrderedMapAny: key decode error at %d: %w" , i , err )
250+ }
251+ if keyTyp != types .TypeString {
252+ return nil , fmt .Errorf ("DecodeOrderedMapAny: map key not string at %d, got %v" , i , keyTyp )
253+ }
254+ key := string (keyPayload )
255+
256+ valTyp , _ , err := nested .PeekTypeWidth ()
257+ if err != nil {
258+ return nil , fmt .Errorf ("DecodeOrderedMapAny: nested value decode error at %d: %w" , i + 1 , err )
259+ }
260+
261+ switch valTyp {
262+ case types .TypeMap :
263+ v , err := DecodeOrderedMapAny (nested ) // delegate recursively
264+ if err != nil {
265+ return nil , fmt .Errorf ("DecodeOrderedMapAny: nested value decode error at %d: %w" , i + 1 , err )
266+ }
267+ out .Set (key , v )
268+
269+ case types .TypeTuple :
270+ v , err := DecodeTuple (nested )
271+ if err != nil {
272+ return nil , fmt .Errorf ("DecodeOrderedMapAny: nested value decode error at %d: %w" , i + 1 , err )
273+ }
274+ out .Set (key , v )
275+
276+ default :
277+ valPayload , valTyp , err := nested .Next ()
278+ if err != nil {
279+ return nil , fmt .Errorf ("DecodeOrderedMapAny: nested value decode error at %d: %w" , i + 1 , err )
280+ }
281+ v , err := DecodePrimitive (valTyp , valPayload )
282+ if err != nil {
283+ return nil , fmt .Errorf ("DecodeOrderedMapAny: nested value decode error at %d: %w" , i + 1 , err )
284+ }
285+ out .Set (key , v )
286+ }
287+ }
288+
289+ if err := seq .Advance (); err != nil {
290+ return nil , fmt .Errorf ("DecodeOrderedMapAny: advance failed at pos %d: %w" , pos , err )
291+ }
292+ return out , nil
293+ }
294+
211295// Decode: convenience entry point for decoding a buffer that contains a top-level tuple.
296+ // Decode decodes a buffer into Go values.
297+ // Maps inside tuples are decoded as plain map[string]any.
212298func Decode (buf []byte ) (any , error ) {
213299 seq , err := NewSeqGetAccess (buf )
214300 if err != nil {
215301 return nil , fmt .Errorf ("Decode: failed to create sequence: %w" , err )
216302 }
217303
218- // delegate to tuple decoder
219- vals , err := DecodeTupleGeneric (seq , true )
304+ vals , err := DecodeTupleGeneric (seq , true , false ) // ordered=false
220305 if err != nil {
221306 return nil , fmt .Errorf ("Decode: tuple decode failed: %w" , err )
222307 }
@@ -225,3 +310,21 @@ func Decode(buf []byte) (any, error) {
225310 }
226311 return vals , nil
227312}
313+
314+ // DecodeOrdered decodes a buffer into Go values.
315+ // Maps inside tuples are decoded as *types.OrderedMapAny.
316+ func DecodeOrdered (buf []byte ) (any , error ) {
317+ seq , err := NewSeqGetAccess (buf )
318+ if err != nil {
319+ return nil , fmt .Errorf ("DecodeOrdered: failed to create sequence: %w" , err )
320+ }
321+
322+ vals , err := DecodeTupleGeneric (seq , true , true ) // ordered=true
323+ if err != nil {
324+ return nil , fmt .Errorf ("DecodeOrdered: tuple decode failed: %w" , err )
325+ }
326+ if len (vals ) == 1 {
327+ return vals [0 ], nil
328+ }
329+ return vals , nil
330+ }
0 commit comments