70 lines
1.3 KiB
Go
70 lines
1.3 KiB
Go
|
package ndr
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"reflect"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
const ndrNameSpace = "ndr"
|
||
|
|
||
|
type tags struct {
|
||
|
Values []string
|
||
|
Map map[string]string
|
||
|
}
|
||
|
|
||
|
// parse the struct field tags and extract the ndr related ones.
|
||
|
// format of tag ndr:"value,key:value1,value2"
|
||
|
func parseTags(st reflect.StructTag) tags {
|
||
|
s := st.Get(ndrNameSpace)
|
||
|
t := tags{
|
||
|
Values: []string{},
|
||
|
Map: make(map[string]string),
|
||
|
}
|
||
|
if s != "" {
|
||
|
ndrTags := strings.Trim(s, `"`)
|
||
|
for _, tag := range strings.Split(ndrTags, ",") {
|
||
|
if strings.Contains(tag, ":") {
|
||
|
m := strings.SplitN(tag, ":", 2)
|
||
|
t.Map[m[0]] = m[1]
|
||
|
} else {
|
||
|
t.Values = append(t.Values, tag)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return t
|
||
|
}
|
||
|
|
||
|
func appendTag(t reflect.StructTag, s string) reflect.StructTag {
|
||
|
ts := t.Get(ndrNameSpace)
|
||
|
ts = fmt.Sprintf(`%s"%s,%s"`, ndrNameSpace, ts, s)
|
||
|
return reflect.StructTag(ts)
|
||
|
}
|
||
|
|
||
|
func (t *tags) StructTag() reflect.StructTag {
|
||
|
mv := t.Values
|
||
|
for key, val := range t.Map {
|
||
|
mv = append(mv, key+":"+val)
|
||
|
}
|
||
|
s := ndrNameSpace + ":" + `"` + strings.Join(mv, ",") + `"`
|
||
|
return reflect.StructTag(s)
|
||
|
}
|
||
|
|
||
|
func (t *tags) delete(s string) {
|
||
|
for i, x := range t.Values {
|
||
|
if x == s {
|
||
|
t.Values = append(t.Values[:i], t.Values[i+1:]...)
|
||
|
}
|
||
|
}
|
||
|
delete(t.Map, s)
|
||
|
}
|
||
|
|
||
|
func (t *tags) HasValue(s string) bool {
|
||
|
for _, v := range t.Values {
|
||
|
if v == s {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|