Skip to content

Commit

Permalink
fix issue #10
Browse files Browse the repository at this point in the history
  • Loading branch information
fstab committed Jan 25, 2017
1 parent c797afd commit d6e3af9
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 8 deletions.
12 changes: 11 additions & 1 deletion templates/template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,23 @@ func TestReferencedGrokFields(t *testing.T) {
template: "{{.hello}} world, {{timestamp \"02/01/2006 - 15:04:05.000\" .time}}",
expectedGrokFields: []string{"hello", "time"},
},
{
// Issue #10
template: "{{if eq .field \"value\"}}text{{end}}",
expectedGrokFields: []string{"field"},
},
{
// Issue #10
template: "{{if eq .field1 .field2}}{{.field3}}{{else}}{{.field4}}{{end}}",
expectedGrokFields: []string{"field1", "field2", "field3", "field4"},
},
} {
parsedTemplate, err := New(fmt.Sprintf("test%v", i), test.template)
if err != nil {
t.Fatalf("unexpected error in template %v: %v", i, err)
return
}
assertArrayEqualsIgnoreOrder(t, parsedTemplate.ReferencedGrokFields(), test.expectedGrokFields)
assertArrayEqualsIgnoreOrder(t, test.expectedGrokFields, parsedTemplate.ReferencedGrokFields())
}
}

Expand Down
61 changes: 54 additions & 7 deletions templates/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,28 +93,75 @@ func fixCommas(layout, value string) (string, string, error) {
}

func referencedGrokFields(t *text_template.Template) ([]string, error) {
result := make([]string, 0)
var (
result = make([]string, 0)
fields []string
err error
)
for _, node := range t.Root.Nodes {
if actionNode, ok := node.(*parse.ActionNode); ok {
for _, cmd := range actionNode.Pipe.Cmds {
if err := validateFunctionCalls(cmd); err != nil {
if fields, err = extractGrokFieldsFromNode(node); err != nil {
return nil, err
}
result = append(result, fields...)
}
return result, nil
}

func extractGrokFieldsFromNode(node parse.Node) ([]string, error) {
var (
result = make([]string, 0)
fields []string
err error
)
switch t := node.(type) {
case *parse.ActionNode:
for _, cmd := range t.Pipe.Cmds {
if err = validateFunctionCalls(cmd); err != nil {
return nil, err
}
if fields, err = extractGrokFieldsFromCmd(cmd); err != nil {
return nil, err
}
result = append(result, fields...)
}
case *parse.IfNode:
for _, cmd := range t.Pipe.Cmds {
if err = validateFunctionCalls(cmd); err != nil {
return nil, err
}
if fields, err = extractGrokFieldsFromCmd(cmd); err != nil {
return nil, err
}
result = append(result, fields...)
}
if t.List != nil {
for _, n := range t.List.Nodes {
if fields, err = extractGrokFieldsFromNode(n); err != nil {
return nil, err
}
result = append(result, extractGrokFields(cmd)...)
result = append(result, fields...)
}
}
if t.ElseList != nil {
for _, n := range t.ElseList.Nodes {
if fields, err = extractGrokFieldsFromNode(n); err != nil {
return nil, err
}
result = append(result, fields...)
}
}
}
return result, nil
}

func extractGrokFields(cmd *parse.CommandNode) []string {
func extractGrokFieldsFromCmd(cmd *parse.CommandNode) ([]string, error) {
result := make([]string, 0)
for _, arg := range cmd.Args {
if fieldNode, ok := arg.(*parse.FieldNode); ok {
result = append(result, fieldNode.Ident...)
}
}
return result
return result, nil
}

func validateFunctionCalls(cmd *parse.CommandNode) error {
Expand Down

0 comments on commit d6e3af9

Please sign in to comment.