// recursively func handleSection(section *conf.Conf) { ident := section.String(IDENT, "") if ident != "" { if _, present := graph[ident]; present { fmt.Printf("ident[%s]duplicated\n", ident) os.Exit(1) } ie := &identEntry{} ie.matches = make([]string, 0, 10) ie.disabled = section.Bool(DISABLED, false) if section.StringList(MATCH, nil) == nil { ie.isInput = true } graph[ident] = ie pluginName := section.String(NAME, "") if pluginName != "" { identName[pluginName] = ident } } matches := section.StringList(MATCH, nil) if matches != nil { pluginName := section.String(NAME, "") if pluginName == "" { fmt.Printf("plugin match %v has no 'name' key\n", matches) os.Exit(1) } for _, id := range matches { if _, present := graph[id]; present { graph[id].matches = append(graph[id].matches, pluginName) } else { fmt.Printf("%15s -> %s\n", id, pluginName) } } } sub := section.Interface("", nil).(map[string]interface{}) if sub == nil { return } for k, v := range sub { if x, ok := v.([]interface{}); ok { switch x[0].(type) { case string, float64, int, bool, time.Time: // this section will never find 'ident' continue } for i := 0; i < len(section.List(k, nil)); i++ { key := fmt.Sprintf("%s[%d]", k, i) sec, err := section.Section(key) if err != nil { continue } handleSection(sec) } } } }