62 lines
1.1 KiB
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
|
|
}
|