mirror of
				https://github.com/traefik/traefik.git
				synced 2025-11-04 02:11:15 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			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)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |