pkg/rest/codec/tag.go

62 lines
1.1 KiB
Go

package codec
import (
"fmt"
"strings"
)
const (
// tagName 结构体tag名称
// 格式参考 https://pkg.go.dev/encoding/json/v2#example-package-FormatFlags
tagName = "req"
inOptName = "in"
queryOptName = "query"
pathOptName = "path"
formOptName = "form"
headerOptName = "header"
)
// Tag is a struct tag
type Tag struct {
Name string // tag name
In string // query/path参数中
Option map[string]string // 自定义参数
}
func parseTag(tagStr string) (*Tag, error) {
tagStr = strings.TrimSpace(tagStr)
if tagStr == "" {
return nil, fmt.Errorf("tag is empty")
}
parts := strings.Split(tagStr, ",")
name := strings.TrimSpace(parts[0])
t := &Tag{
Name: name,
Option: map[string]string{},
}
for _, part := range parts[1:] {
part = strings.TrimSpace(part)
if part == "" {
return nil, fmt.Errorf("tag option not valid")
}
opt := strings.SplitN(part, ":", 2)
key := opt[0]
val := ""
if len(opt) == 2 {
val = opt[1]
}
if key == inOptName {
t.In = val
} else {
t.Option[key] = val
}
}
return t, nil
}