8
8
"os"
9
9
"regexp"
10
10
"strings"
11
- "unicode"
12
11
13
12
gno "github.com/gnolang/gno/gnovm/pkg/gnolang"
14
13
"github.com/gnolang/gno/gnovm/stdlibs"
@@ -220,40 +219,30 @@ func (vm *VMKeeper) Call(ctx sdk.Context, msg MsgCall) (res string, err error) {
220
219
mpn .Define ("pkg" , gno.TypedValue {T : & gno.PackageType {}, V : pv })
221
220
mpv := mpn .NewPackage ()
222
221
223
- fmt .Println ("request" , string (msg .JSONRequest ))
224
-
225
- // Request
226
- capitalize := func (str string ) string {
227
- runes := []rune (str )
228
- runes [0 ] = unicode .ToUpper (runes [0 ])
229
- return string (runes )
230
- }
222
+ if len (msg .Args ) != len (ft .Params ) {
223
+ return "" , fmt .Errorf ("wrong number of arguments in call to %s: want %d got %d" , fnc , len (ft .Params ), len (msg .Args ))
224
+ }
225
+
226
+ request := make ([]* gno.TypedValue , len (ft .Params ))
227
+ for i , arg := range msg .Args {
228
+ pt := ft .Params [i ].Type
229
+ arg = strings .TrimSpace (arg )
230
+ if len (arg ) > 2 &&
231
+ ((arg [0 ] == '{' && arg [len (arg )- 1 ] == '}' ) ||
232
+ (arg [0 ] == '[' && arg [len (arg )- 1 ] == ']' )) {
233
+ // Handle JSON argument
234
+ request [i ], err = UnmarshalJSON (store .GetAllocator (), store , []byte (arg ), pt )
235
+ if err != nil {
236
+ return "" , fmt .Errorf ("unable to unmarshal arg#%d: %w" , err )
237
+ }
231
238
232
- // Iterate through params
233
- requestParam := & gno.StructType {}
234
- // define gno type
235
- requestNF := len (ft .Params )
236
- requestFS := make ([]gno.FieldType , requestNF )
237
- for i , param := range ft .Params {
238
- name := gno .Name (capitalize (string (param .Name )))
239
- if name == "" {
240
- name = gno .Name (fmt .Sprintf ("Args%d" , i ))
239
+ continue
241
240
}
242
241
243
- fmt .Println (name )
244
- requestFS [i ] = gno.FieldType {
245
- Name : name ,
246
- Type : param .Type ,
247
- }
248
- }
249
- requestParam .PkgPath = mpn .PkgPath
250
- requestParam .Fields = requestFS
242
+ tv := convertArgToGno (arg , pt )
243
+ request [i ] = & tv
251
244
252
- requestTv , err := UnmarshalJSON (store .GetAllocator (), store , msg .JSONRequest , requestParam )
253
- if err != nil {
254
- return "" , fmt .Errorf ("unable to unmarshall json: %w" , err )
255
245
}
256
- fmt .Println ("request tv" , requestTv )
257
246
258
247
// Create expresion
259
248
argslist := ""
@@ -265,7 +254,7 @@ func (vm *VMKeeper) Call(ctx sdk.Context, msg MsgCall) (res string, err error) {
265
254
}
266
255
267
256
expr := fmt .Sprintf (`pkg.%s(%s)` , fnc , argslist )
268
- fmt .Println ("expr" , expr )
257
+ fmt .Printf ("expr%v \r \n " , expr )
269
258
xn := gno .MustParseExpr (expr )
270
259
271
260
// Send send-coins to pkg from caller.
@@ -283,14 +272,9 @@ func (vm *VMKeeper) Call(ctx sdk.Context, msg MsgCall) (res string, err error) {
283
272
panic ("variadic calls not yet supported" )
284
273
}
285
274
286
- // if len(msg.Args) != len(ft.Params) {
287
- // panic(fmt.Sprintf("wrong number of arguments in call to %s: want %d got %d", fnc, len(ft.Params), len(msg.Args)))
288
- // }
289
-
290
- fmt .Println ("request tv type" , requestTv .T .String ())
291
- for i , arg := range requestTv .V .(* gno.StructValue ).Fields {
275
+ for i , arg := range request {
292
276
cx .Args [i ] = & gno.ConstExpr {
293
- TypedValue : arg ,
277
+ TypedValue : * arg ,
294
278
}
295
279
}
296
280
@@ -333,54 +317,53 @@ func (vm *VMKeeper) Call(ctx sdk.Context, msg MsgCall) (res string, err error) {
333
317
// Result
334
318
335
319
// Iterate through params
336
- var result gno.TypedValue
320
+ var response gno.TypedValue
337
321
{
338
322
var sv gno.StructValue
339
323
var st gno.StructType
340
324
341
- // define gno type
342
- resultNF := len ( rtvs )
343
- resultFS := make ([] gno.FieldType , resultNF )
344
- resultTV := make ([]gno. TypedValue , resultNF )
345
- for i , rtv := range rtvs {
346
- name := gno .Name ( fmt . Sprintf ( "Args%d" , i ))
347
- resultFS [ i ] = gno.FieldType {
348
- Name : name ,
349
- Type : rtv . T ,
350
- }
325
+ // Generate result Typed Valye
326
+ result := gno. TypedValue {
327
+ V : & gno.ArrayValue {
328
+ List : rtvs ,
329
+ },
330
+ T : & gno.ArrayType {
331
+ Elt : & gno.InterfaceType {},
332
+ Len : len ( rtvs ) ,
333
+ } ,
334
+ }
351
335
352
- fmt .Println (name , rtv .String ())
353
- resultTV [i ] = rtv
336
+ // Define response fields
337
+ responseFS := []gno.FieldType {
338
+ gno.FieldType {
339
+ Name : gno .Name ("Result" ),
340
+ Type : result .T ,
341
+ },
342
+ gno.FieldType {
343
+ Name : gno .Name ("CPUCycles" ),
344
+ Type : gno .Int64Type ,
345
+ },
354
346
}
355
- resultFS = append ( resultFS , gno.FieldType {
356
- Name : gno . Name ( "NumCycles" ),
357
- Type : gno . Int64Type ,
358
- } )
347
+ responseTV := make ([] gno.TypedValue , 0 , len ( responseFS ))
348
+
349
+ // Add result value
350
+ responseTV = append ( responseTV , result )
359
351
360
352
// Add cpucycle to responses
361
353
cycle := gno.TypedValue {T : gno .Int64Type }
362
354
cycle .SetInt64 (m .Cycles )
363
- resultTV = append (resultTV , cycle )
355
+ responseTV = append (responseTV , cycle )
364
356
365
357
st .PkgPath = mpn .PkgPath
366
- st .Fields = resultFS
367
- sv .Fields = resultTV
358
+ st .Fields = responseFS
359
+ sv .Fields = responseTV
368
360
369
- result = gno.TypedValue {
370
- T : & st ,
371
- V : & sv ,
372
- }
361
+ response .T = & st
362
+ response .V = & sv
373
363
}
374
364
375
365
ctx .Logger ().Info ("CPUCYCLES call" , "num-cycles" , m .Cycles )
376
- // for i, rtv := range rtvs {
377
- // res = res + rtv.String()
378
- // if i < len(rtvs)-1 {
379
- // res += "\n"
380
- // }
381
- // }
382
-
383
- resraw , err := MarshalJSON (& result )
366
+ resraw , err := MarshalJSON (& response )
384
367
if err != nil {
385
368
return "" , fmt .Errorf ("unable to unarmsahll result: %w" , err )
386
369
}
0 commit comments