// getSortedNamespaces sorts the namespace attributes by their prefix func getSortedNamespaces(list map[string]string) []etree.Attr { var keys []string for k := range list { keys = append(keys, k) } sort.Strings(keys) elem := etree.Element{} for _, k := range keys { elem.CreateAttr(k, list[k]) } return elem.Attr }
// SetBuilderElementValue if it will change to struct from map if the future's // author is feeling a bothersome in this function. func SetBuilderElementValue(elm *etree.Element, data map[string]interface{}, basekey string) (*etree.Element, bool) { var child *etree.Element key := basekey ts, tk := spaceDecompose(elm.Tag) _, sk := spaceDecompose(elm.Space) if elm.Tag != "" && ts != "" && tk != "" { key = fmt.Sprintf("%s:%s", elm.Space, basekey) } else if sk != "" { key = fmt.Sprintf("%s:%s", sk, basekey) } if values, ok := data[basekey]; ok { switch value := values.(type) { case nil: default: child = elm.CreateElement(key) child.SetText(fmt.Sprint(value)) case int: child = elm.CreateElement(key) child.SetText(fmt.Sprint(value)) case string: child = elm.CreateElement(key) child.SetText(value) case float64, float32: child = elm.CreateElement(key) child.SetText(fmt.Sprint(value)) case time.Time: child = elm.CreateElement(key) child.SetText(value.Format(time.RFC3339)) case bool: _ = elm.CreateElement(fmt.Sprintf("%s:%s", key, key)) case []int: for _, v := range value { child = elm.CreateElement(key) child.SetText(fmt.Sprint(v)) } case []string: for _, v := range value { child = elm.CreateElement(key) child.SetText(v) } case Attrs: val, attrs := value[0], value[1] child, _ = SetBuilderElementValue(elm, URL{basekey: val}, basekey) switch attr := attrs.(type) { case map[string]string: for k, v := range attr { child.CreateAttr(k, v) } // TODO: gotta remove below case Attr: for k, v := range attr { child.CreateAttr(k, v) } } case interface{}: var childkey string if sk == "" { childkey = fmt.Sprintf("%s:%s", key, key) } else { childkey = fmt.Sprint(key) } switch value := values.(type) { case []URL: for _, v := range value { child := elm.CreateElement(childkey) for ck := range v { SetBuilderElementValue(child, v, ck) } } case URL: child := elm.CreateElement(childkey) for ck := range value { SetBuilderElementValue(child, value, ck) } } } return child, true } return child, false }