@@ -60,40 +60,58 @@ func decodeCborRaw(data []byte) (any, error) {
60
60
}
61
61
}
62
62
63
- func decodeCborRawList (data []byte ) ([] any , error ) {
63
+ func decodeCborRawList (data []byte ) (any , error ) {
64
64
var tmpData []cbor.RawMessage
65
65
if err := cbor .Unmarshal (data , & tmpData ); err != nil {
66
66
return nil , err
67
67
}
68
- ret := make ([]any , len (tmpData ))
68
+ tmpItems := make ([]PlutusData , len (tmpData ))
69
69
for i , item := range tmpData {
70
70
tmp , err := decodeCborRaw (item )
71
71
if err != nil {
72
72
return nil , err
73
73
}
74
- ret [i ] = tmp
74
+ tmpPd , err := decodeRaw (tmp )
75
+ if err != nil {
76
+ return nil , err
77
+ }
78
+ tmpItems [i ] = tmpPd
75
79
}
76
- return ret , nil
80
+ return NewList ( tmpItems ... ) , nil
77
81
}
78
82
79
- func decodeCborRawMap (data []byte ) (map [ any ] any , error ) {
83
+ func decodeCborRawMap (data []byte ) (any , error ) {
80
84
var tmpData map [RawMessageStr ]RawMessageStr
81
85
if err := cbor .Unmarshal (data , & tmpData ); err != nil {
82
86
return nil , err
83
87
}
84
- ret := make (map [ any ] any , len (tmpData ))
88
+ pairs := make ([][ 2 ] PlutusData , 0 , len (tmpData ))
85
89
for k , v := range tmpData {
86
90
tmpKey , err := decodeCborRaw (k .Bytes ())
87
91
if err != nil {
88
92
return nil , err
89
93
}
94
+ tmpKeyPd , err := decodeRaw (tmpKey )
95
+ if err != nil {
96
+ return nil , err
97
+ }
90
98
tmpVal , err := decodeCborRaw (v .Bytes ())
91
99
if err != nil {
92
100
return nil , err
93
101
}
94
- ret [tmpKey ] = tmpVal
102
+ tmpValPd , err := decodeRaw (tmpVal )
103
+ if err != nil {
104
+ return nil , err
105
+ }
106
+ pairs = append (
107
+ pairs ,
108
+ [2 ]PlutusData {
109
+ tmpKeyPd ,
110
+ tmpValPd ,
111
+ },
112
+ )
95
113
}
96
- return ret , nil
114
+ return NewMap ( pairs ) , nil
97
115
}
98
116
99
117
// decodeRaw converts a raw CBOR-decoded value into PlutusData.
@@ -154,6 +172,12 @@ func decodeRaw(v any) (PlutusData, error) {
154
172
case * Integer :
155
173
return x , nil
156
174
175
+ case * List :
176
+ return x , nil
177
+
178
+ case * Map :
179
+ return x , nil
180
+
157
181
default :
158
182
return nil , fmt .Errorf ("unsupported CBOR type for PlutusData: %T" , x )
159
183
}
@@ -217,29 +241,16 @@ func decodeConstr(tag uint64, content cbor.RawMessage) (PlutusData, error) {
217
241
if err != nil {
218
242
return nil , err
219
243
}
220
- arr , ok := tmpData .([] any )
244
+ tmpList , ok := tmpData .(* List )
221
245
if ! ok {
222
246
return nil , fmt .Errorf (
223
247
"expected array for Constr tag %d, got %T" ,
224
248
tag ,
225
- content ,
249
+ tmpData ,
226
250
)
227
251
}
228
252
229
- fields := make ([]PlutusData , len (arr ))
230
-
231
- for i , item := range arr {
232
- pd , err := decodeRaw (item )
233
- if err != nil {
234
- return nil , fmt .Errorf (
235
- "failed to decode Constr field %d: %w" ,
236
- i ,
237
- err ,
238
- )
239
- }
240
-
241
- fields [i ] = pd
242
- }
253
+ fields := tmpList .Items
243
254
244
255
return NewConstr (uint (tag ), fields ... ), nil
245
256
}
0 commit comments