1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
package bexpr
import (
"fmt"
"io"
"strings"
)
// TODO - Probably should make most of what is in here un-exported
//go:generate pigeon -o grammar.go -optimize-parser grammar.peg
//go:generate goimports -w grammar.go
type Expression interface {
ExpressionDump(w io.Writer, indent string, level int)
}
type UnaryOperator int
const (
UnaryOpNot UnaryOperator = iota
)
func (op UnaryOperator) String() string {
switch op {
case UnaryOpNot:
return "Not"
default:
return "UNKNOWN"
}
}
type BinaryOperator int
const (
BinaryOpAnd BinaryOperator = iota
BinaryOpOr
)
func (op BinaryOperator) String() string {
switch op {
case BinaryOpAnd:
return "And"
case BinaryOpOr:
return "Or"
default:
return "UNKNOWN"
}
}
type MatchOperator int
const (
MatchEqual MatchOperator = iota
MatchNotEqual
MatchIn
MatchNotIn
MatchIsEmpty
MatchIsNotEmpty
MatchMatches
MatchNotMatches
)
func (op MatchOperator) String() string {
switch op {
case MatchEqual:
return "Equal"
case MatchNotEqual:
return "Not Equal"
case MatchIn:
return "In"
case MatchNotIn:
return "Not In"
case MatchIsEmpty:
return "Is Empty"
case MatchIsNotEmpty:
return "Is Not Empty"
case MatchMatches:
return "Matches"
case MatchNotMatches:
return "Not Matches"
default:
return "UNKNOWN"
}
}
type MatchValue struct {
Raw string
Converted interface{}
}
type UnaryExpression struct {
Operator UnaryOperator
Operand Expression
}
type BinaryExpression struct {
Left Expression
Operator BinaryOperator
Right Expression
}
type Selector []string
func (sel Selector) String() string {
return strings.Join([]string(sel), ".")
}
type MatchExpression struct {
Selector Selector
Operator MatchOperator
Value *MatchValue
}
func (expr *UnaryExpression) ExpressionDump(w io.Writer, indent string, level int) {
localIndent := strings.Repeat(indent, level)
fmt.Fprintf(w, "%s%s {\n", localIndent, expr.Operator.String())
expr.Operand.ExpressionDump(w, indent, level+1)
fmt.Fprintf(w, "%s}\n", localIndent)
}
func (expr *BinaryExpression) ExpressionDump(w io.Writer, indent string, level int) {
localIndent := strings.Repeat(indent, level)
fmt.Fprintf(w, "%s%s {\n", localIndent, expr.Operator.String())
expr.Left.ExpressionDump(w, indent, level+1)
expr.Right.ExpressionDump(w, indent, level+1)
fmt.Fprintf(w, "%s}\n", localIndent)
}
func (expr *MatchExpression) ExpressionDump(w io.Writer, indent string, level int) {
switch expr.Operator {
case MatchEqual, MatchNotEqual, MatchIn, MatchNotIn:
fmt.Fprintf(w, "%[1]s%[3]s {\n%[2]sSelector: %[4]v\n%[2]sValue: %[5]q\n%[1]s}\n", strings.Repeat(indent, level), strings.Repeat(indent, level+1), expr.Operator.String(), expr.Selector, expr.Value.Raw)
default:
fmt.Fprintf(w, "%[1]s%[3]s {\n%[2]sSelector: %[4]v\n%[1]s}\n", strings.Repeat(indent, level), strings.Repeat(indent, level+1), expr.Operator.String(), expr.Selector)
}
}
|