53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package taskchannel
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
// ExtractMetadata 从已解析的请求 map 中提取 metadata 子 map。
|
|
// 同时删除 "model" 字段防止通过 metadata 覆盖计费模型。
|
|
func ExtractMetadata(req map[string]any) map[string]any {
|
|
if req == nil {
|
|
return nil
|
|
}
|
|
meta, ok := req["metadata"].(map[string]any)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
delete(meta, "model")
|
|
return meta
|
|
}
|
|
|
|
// UnmarshalMetadata 将 metadata map 通过 JSON 往返反序列化到目标结构体。
|
|
// metadata 为 nil 时直接返回 nil,不修改 target。
|
|
func UnmarshalMetadata(metadata map[string]any, target any) error {
|
|
if len(metadata) == 0 {
|
|
return nil
|
|
}
|
|
metaBytes, err := json.Marshal(metadata)
|
|
if err != nil {
|
|
return fmt.Errorf("marshal metadata failed: %w", err)
|
|
}
|
|
if err := json.Unmarshal(metaBytes, target); err != nil {
|
|
return fmt.Errorf("unmarshal metadata failed: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DefaultString 返回 val(非空时),否则返回 fallback。
|
|
func DefaultString(val, fallback string) string {
|
|
if val == "" {
|
|
return fallback
|
|
}
|
|
return val
|
|
}
|
|
|
|
// DefaultInt 返回 val(非零时),否则返回 fallback。
|
|
func DefaultInt(val, fallback int) int {
|
|
if val == 0 {
|
|
return fallback
|
|
}
|
|
return val
|
|
}
|