67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"reflect"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/traefik/paerser/parser"
|
||
|
)
|
||
|
|
||
|
func encodeNode(labels map[string]string, root string, node *parser.Node) {
|
||
|
for _, child := range node.Children {
|
||
|
if child.Disabled {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
var sep string
|
||
|
if child.Name[0] != '[' {
|
||
|
sep = "."
|
||
|
}
|
||
|
|
||
|
childName := root + sep + child.Name
|
||
|
|
||
|
if child.RawValue != nil {
|
||
|
encodeRawValue(labels, childName, child.RawValue)
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if strings.Contains(child.Tag.Get(parser.TagLabel), parser.TagLabelAllowEmpty) {
|
||
|
labels[childName] = "true"
|
||
|
}
|
||
|
|
||
|
if len(child.Children) > 0 {
|
||
|
encodeNode(labels, childName, child)
|
||
|
} else if len(child.Name) > 0 {
|
||
|
labels[childName] = child.Value
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func encodeRawValue(labels map[string]string, root string, rawValue interface{}) {
|
||
|
if rawValue == nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
tValue := reflect.TypeOf(rawValue)
|
||
|
|
||
|
if tValue.Kind() == reflect.Map && tValue.Elem().Kind() == reflect.Interface {
|
||
|
r := reflect.ValueOf(rawValue).
|
||
|
Convert(reflect.TypeOf((map[string]interface{})(nil))).
|
||
|
Interface().(map[string]interface{})
|
||
|
|
||
|
for k, v := range r {
|
||
|
switch tv := v.(type) {
|
||
|
case string:
|
||
|
labels[root+"."+k] = tv
|
||
|
case []interface{}:
|
||
|
for i, e := range tv {
|
||
|
encodeRawValue(labels, fmt.Sprintf("%s.%s[%d]", root, k, i), e)
|
||
|
}
|
||
|
default:
|
||
|
encodeRawValue(labels, root+"."+k, v)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|