blob: 01657e0a1d7703ad0ca86056722795c0bb15ce0a [file] [log] [blame]
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
}