82 lines
2.1 KiB
Go
82 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|