package transcode import ( "encoding/base64" "fmt" ) // 本文件解析工具面入参(sdk.Tool.Execute 的 args)。它与 SDK 的「args 是一个 // JSON 对象」约定对齐:非对象、缺字段、类型不对一律 ErrBadArgs,绝不猜测。 // 参数名在 tool.go 的常量块里统一定义。 // toolRequest 把工具入参解成一次转码请求。 // // source 可省略(留空 ⇒ 由 engine 按魔数嗅探);data_base64 与 target 必填。 // base64 用标准字母表(与 Execute 输出同一份编码,往返无损)。 func toolRequest(args any) (Request, error) { m, ok := args.(map[string]any) if !ok { return Request{}, fmt.Errorf("transcode: %w: args must be an object", ErrBadArgs) } data, err := toolDataArg(m) if err != nil { return Request{}, err } target := FormatOf(toolStringArg(m, toolArgTarget)) if target == "" { return Request{}, fmt.Errorf("transcode: %w: missing %s", ErrBadArgs, toolArgTarget) } return Request{ Data: data, Source: FormatOf(toolStringArg(m, toolArgSource)), Target: target, }, nil } // toolStringArg 读一个字符串字段;字段缺失或不是字符串都算空串。 func toolStringArg(m map[string]any, key string) string { s, _ := m[key].(string) return s } // toolDataArg 解出源字节:Base64 标准字母表,空串/非法 Base64/空字节都拒。 func toolDataArg(m map[string]any) ([]byte, error) { raw := toolStringArg(m, toolArgData) if raw == "" { return nil, fmt.Errorf("transcode: %w: missing %s", ErrBadArgs, toolArgData) } data, err := base64.StdEncoding.DecodeString(raw) if err != nil { return nil, fmt.Errorf("transcode: %w: %s is not valid base64: %v", ErrBadArgs, toolArgData, err) } if len(data) == 0 { return nil, fmt.Errorf("transcode: %w: %s decodes to zero bytes", ErrBadArgs, toolArgData) } return data, nil }