diff --git a/grok.go b/grok.go index 1c362e3..49e97f2 100644 --- a/grok.go +++ b/grok.go @@ -89,6 +89,11 @@ func (g *Grok) AddPatternsFromMap(m map[string]string) error { for k, v := range m { keys := []string{} for _, key := range re.FindAllStringSubmatch(v, -1) { + if g.patterns[key[1]] == nil { + if m[key[1]] == "" { + return fmt.Errorf("no pattern found for %%{%s}", key[1]) + } + } keys = append(keys, key[1]) } patternDeps[k] = keys diff --git a/grok_test.go b/grok_test.go index e535902..2d93689 100644 --- a/grok_test.go +++ b/grok_test.go @@ -537,3 +537,68 @@ func TestParseTypedWithSemanticHomonyms(t *testing.T) { } } } + +func TestGrok_AddPatternsFromMap_not_exist(t *testing.T) { + defer func() { + if r := recover(); r != nil { + t.Fatalf("AddPatternsFromMap panics: %v", r) + } + }() + g := New() + err := g.AddPatternsFromMap(map[string]string{ + "SOME": "%{NOT_EXIST}", + }) + if err == nil { + t.Errorf("AddPatternsFromMap should returns an error") + } +} + +func TestGrok_AddPatternsFromMap_simple(t *testing.T) { + defer func() { + if r := recover(); r != nil { + t.Fatalf("AddPatternsFromMap panics: %v", r) + } + }() + g := New() + err := g.AddPatternsFromMap(map[string]string{ + "NO3": `\d{3}`, + }) + if err != nil { + t.Errorf("AddPatternsFromMap returns an error: %v", err) + } + mss, err := g.Parse("%{NO3:match}", "333") + if err != nil { + t.Error("parsing error:", err) + t.FailNow() + } + if mss["match"] != "333" { + t.Errorf("bad match: expected 333, got %s", mss["match"]) + } +} + +func TestGrok_AddPatternsFromMap_complex(t *testing.T) { + defer func() { + if r := recover(); r != nil { + t.Fatalf("AddPatternsFromMap panics: %v", r) + } + }() + g := NewWithConfig(&Config{ + SkipDefaultPatterns: true, + NamedCapturesOnly: true, + }) + err := g.AddPatternsFromMap(map[string]string{ + "NO3": `\d{3}`, + "NO6": "%{NO3}%{NO3}", + }) + if err != nil { + t.Errorf("AddPatternsFromMap returns an error: %v", err) + } + mss, err := g.Parse("%{NO6:number}", "333666") + if err != nil { + t.Error("parsing error:", err) + t.FailNow() + } + if mss["number"] != "333666" { + t.Errorf("bad match: expected 333666, got %s", mss["match"]) + } +}