package builtin import ( "context" "encoding/json" "fmt" "modernc.org/quickjs" ) func createWrapper[T Args, R any](fn Func[T, R], isAsync bool) interface{} { if !isAsync { return createSyncWrapper[T, R](fn) } return createAsyncWrapper[T, R](fn) } func createSyncWrapper[T Args, R any](fn Func[T, R]) interface{} { return func(rawArgs any) (R, error) { var zero R var args T obj, ok := rawArgs.(*quickjs.Object) if ok { jsonData, err := obj.MarshalJSON() if err != nil { return zero, fmt.Errorf("failed to marshal args: %w", err) } if err := json.Unmarshal(jsonData, &args); err != nil { return zero, fmt.Errorf("failed to unmarshal args: %w", err) } } else if rawArgs != nil && rawArgs != quickjs.UndefinedValue { jsonData, err := json.Marshal(rawArgs) if err != nil { return zero, fmt.Errorf("failed to marshal args: %w", err) } if err := json.Unmarshal(jsonData, &args); err != nil { return zero, fmt.Errorf("failed to unmarshal args: %w", err) } } if err := args.Validate(); err != nil { return zero, fmt.Errorf("argument validation failed: %w", err) } ctx := context.Background() return fn(ctx, args) } } func createAsyncWrapper[T Args, R any](fn Func[T, R]) interface{} { return func(rawArgs any) (any, error) { var args T obj, ok := rawArgs.(*quickjs.Object) if ok { jsonData, err := obj.MarshalJSON() if err != nil { return nil, fmt.Errorf("failed to marshal args: %w", err) } if err := json.Unmarshal(jsonData, &args); err != nil { return nil, fmt.Errorf("failed to unmarshal args: %w", err) } } else if rawArgs != nil && rawArgs != quickjs.UndefinedValue { jsonData, err := json.Marshal(rawArgs) if err != nil { return nil, fmt.Errorf("failed to marshal args: %w", err) } if err := json.Unmarshal(jsonData, &args); err != nil { return nil, fmt.Errorf("failed to unmarshal args: %w", err) } } if err := args.Validate(); err != nil { return nil, fmt.Errorf("argument validation failed: %w", err) } ctx := context.Background() return fn(ctx, args) } }