123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- 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
- }
|