diff --git a/provider/pipeline/pipeline.go b/provider/pipeline/pipeline.go index 9d6bb92e2..ef99410c8 100644 --- a/provider/pipeline/pipeline.go +++ b/provider/pipeline/pipeline.go @@ -18,6 +18,7 @@ import ( type Pipeline struct { re *regexp.Regexp jq *gojq.Query + dflt string unpack string decode string vm *otto.Otto @@ -25,12 +26,13 @@ type Pipeline struct { } type Settings struct { - Regex string - Jq string - Unpack string - Decode string - VM string - Script string + Regex string + Default string + Jq string + Unpack string + Decode string + VM string + Script string } func New(cc Settings) (*Pipeline, error) { @@ -38,7 +40,7 @@ func New(cc Settings) (*Pipeline, error) { var err error if err == nil && cc.Regex != "" { - _, err = p.WithRegex(cc.Regex) + _, err = p.WithRegex(cc.Regex, cc.Default) } if err == nil && cc.Jq != "" { @@ -61,13 +63,14 @@ func New(cc Settings) (*Pipeline, error) { } // WithRegex adds a regex query applied to the mqtt listener payload -func (p *Pipeline) WithRegex(regex string) (*Pipeline, error) { +func (p *Pipeline) WithRegex(regex, dflt string) (*Pipeline, error) { re, err := regexp.Compile(regex) if err != nil { return nil, fmt.Errorf("invalid regex '%s': %w", re, err) } p.re = re + p.dflt = dflt return p, nil } @@ -185,6 +188,8 @@ func (p *Pipeline) Process(in []byte) ([]byte, error) { b = m[0] // full match } else if len(m) > 1 { b = m[1] // first submatch + } else if len(p.dflt) > 0 { + return []byte(p.dflt), nil } } diff --git a/provider/pipeline/pipeline_test.go b/provider/pipeline/pipeline_test.go index 40a95564d..d3b3c26ba 100644 --- a/provider/pipeline/pipeline_test.go +++ b/provider/pipeline/pipeline_test.go @@ -7,7 +7,7 @@ import ( func TestRegex(t *testing.T) { for _, re := range []string{`([0-9.]+)`, `[0-9.]+`} { - p, err := new(Pipeline).WithRegex(re) + p, err := new(Pipeline).WithRegex(re, "") if err != nil { t.Error(err) } @@ -22,3 +22,19 @@ func TestRegex(t *testing.T) { } } } + +func TestRegexDefault(t *testing.T) { + p, err := new(Pipeline).WithRegex(`\d+`, "123") + if err != nil { + t.Error(err) + } + + res, err := p.Process([]byte("xxx")) + if err != nil { + t.Error(err) + } + + if exp := []byte("123"); !bytes.Equal(res, exp) { + t.Errorf("Expected %s, got %s", exp, res) + } +}