filter.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // +build !nofilter
  2. package filtering
  3. import (
  4. "fmt"
  5. "os"
  6. "git.lattuga.net/boyska/circolog/data"
  7. "github.com/araddon/qlbridge/datasource"
  8. "github.com/araddon/qlbridge/expr"
  9. "github.com/araddon/qlbridge/value"
  10. "github.com/araddon/qlbridge/vm"
  11. )
  12. type ExprValue struct {
  13. node expr.Node
  14. expression string
  15. }
  16. func (e *ExprValue) String() string {
  17. if e.node != nil {
  18. return e.node.String()
  19. } else {
  20. return "<Empty Expression>"
  21. }
  22. }
  23. func (e *ExprValue) Set(value string) error {
  24. if value == "" {
  25. e.node = nil
  26. e.expression = value
  27. return nil
  28. }
  29. ast, err := expr.ParseExpression(value)
  30. if err != nil {
  31. return err
  32. }
  33. e.node = ast
  34. e.expression = value
  35. return nil
  36. }
  37. // Validate answers the question whether to include a log line or not.
  38. func (e *ExprValue) Validate(line data.Message) bool {
  39. if e.node == nil {
  40. return true
  41. }
  42. context := datasource.NewContextSimpleNative(line)
  43. val, ok := vm.Eval(context, e.node)
  44. if !ok || val == nil { // errors when evaluating
  45. return false
  46. }
  47. if bv, isBool := val.(value.BoolValue); isBool {
  48. return bv.Val()
  49. }
  50. fmt.Fprintln(os.Stderr, "WARNING: The 'where' expression doesn't return a boolean")
  51. return false
  52. }