mirror of
https://github.com/weaveworks/scope.git
synced 2026-05-08 10:16:55 +00:00
105 lines
2.1 KiB
Go
105 lines
2.1 KiB
Go
package dsl
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
)
|
|
|
|
// ParseExpression parses a single expression string.
|
|
func ParseExpression(str string) (Expression, error) {
|
|
var (
|
|
expr Expression
|
|
not bool
|
|
)
|
|
_, c := lex(str)
|
|
for item := range c {
|
|
switch item.itemType {
|
|
case itemNot:
|
|
not = !not
|
|
|
|
case itemAll:
|
|
expr.selector = selectAll
|
|
|
|
case itemConnected:
|
|
expr.selector = selectConnected
|
|
|
|
case itemNonlocal:
|
|
expr.selector = selectNonlocal
|
|
|
|
case itemLike:
|
|
item = <-c
|
|
switch item.itemType {
|
|
case itemRegex:
|
|
expr.selector = selectLike(item.literal)
|
|
default:
|
|
return Expression{}, fmt.Errorf("bad LIKE: want %s, got %s", itemRegex, item.itemType)
|
|
}
|
|
|
|
case itemWith:
|
|
item = <-c
|
|
switch item.itemType {
|
|
case itemKeyValue:
|
|
expr.selector = selectWith(item.literal)
|
|
default:
|
|
return Expression{}, fmt.Errorf("bad WITH: want %s, got %s", itemKeyValue, item.itemType)
|
|
}
|
|
|
|
case itemHighlight:
|
|
expr.transformer = transformHighlight
|
|
|
|
case itemRemove:
|
|
expr.transformer = transformRemove
|
|
|
|
case itemShowOnly:
|
|
expr.transformer = transformShowOnly
|
|
|
|
case itemMerge:
|
|
expr.transformer = transformMerge
|
|
|
|
case itemGroupBy:
|
|
item = <-c
|
|
switch item.itemType {
|
|
case itemKeyList:
|
|
expr.transformer = transformGroupBy(item.literal)
|
|
default:
|
|
return Expression{}, fmt.Errorf("bad GROUPBY: want %s, got %s", itemKeyList, item.itemType)
|
|
}
|
|
|
|
case itemJoin:
|
|
item = <-c
|
|
switch item.itemType {
|
|
case itemKey:
|
|
expr.transformer = transformJoin(item.literal)
|
|
default:
|
|
return Expression{}, fmt.Errorf("bad JOIN: want %s, got %s", itemKey, item.itemType)
|
|
}
|
|
|
|
default:
|
|
return Expression{}, errors.New(item.literal)
|
|
}
|
|
}
|
|
if not {
|
|
expr.selector = selectNot(expr.selector)
|
|
}
|
|
if expr.transformer == nil {
|
|
expr.transformer = transformHighlight
|
|
}
|
|
return expr, nil
|
|
}
|
|
|
|
// ParseExpressions parses multiple expression strings.
|
|
func ParseExpressions(strs ...string) Expressions {
|
|
var exprs Expressions
|
|
for _, str := range strs {
|
|
expr, err := ParseExpression(str)
|
|
if err != nil {
|
|
log.Printf("%s: %v", str, err)
|
|
continue
|
|
}
|
|
log.Printf("%s: OK", str)
|
|
exprs = append(exprs, expr)
|
|
}
|
|
return exprs
|
|
}
|