57 lines
1.8 KiB
Go
57 lines
1.8 KiB
Go
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
|
|
}
|