func BuildSelectorFromConfig( cfg *common.Config, settings Settings, ) (Selector, error) { var sel []SelectorExpr key := settings.Key multiKey := settings.MultiKey found := false if cfg.HasField(multiKey) { found = true sub, err := cfg.Child(multiKey, -1) if err != nil { return Selector{}, err } var table []*common.Config if err := sub.Unpack(&table); err != nil { return Selector{}, err } for _, config := range table { action, err := buildSingle(config, key) if err != nil { return Selector{}, err } if action != nilSelector { sel = append(sel, action) } } } if settings.EnableSingleOnly && cfg.HasField(key) { found = true // expect event-format-string str, err := cfg.String(key, -1) if err != nil { return Selector{}, err } fmtstr, err := fmtstr.CompileEvent(str) if err != nil { return Selector{}, fmt.Errorf("%v in %v", err, cfg.PathOf(key)) } if fmtstr.IsConst() { str, err := fmtstr.Run(common.MapStr{}) if err != nil { return Selector{}, err } if str != "" { sel = append(sel, ConstSelectorExpr(str)) } } else { sel = append(sel, FmtSelectorExpr(fmtstr, "")) } } if settings.FailEmpty && !found { if settings.EnableSingleOnly { return Selector{}, fmt.Errorf("missing required '%v' or '%v' in %v", key, multiKey, cfg.Path()) } return Selector{}, fmt.Errorf("missing required '%v' in %v", multiKey, cfg.Path()) } return MakeSelector(sel...), nil }