package filter
import (
)
func ( string) (ui.Text, []error) {
, := parseFilter()
:= walker{}
.walk()
:= ui.StyleRegions(, .regions)
return , nil
}
type walker struct {
regions []ui.StylingRegion
}
func ( *walker) ( diag.Ranger, ui.Styling) {
:= ui.StylingRegion{Ranging: .Range(), Styling: }
.regions = append(.regions, )
}
func ( *walker) ( parse.Node) {
switch n := .(type) {
case *parse.Sep:
.walkSep()
case *parse.Primary:
.walkPrimary()
}
for , := range parse.Children() {
.()
}
}
func ( *walker) ( *parse.Sep) {
:= parse.SourceText()
:= strings.TrimLeftFunc(, parse.IsWhitespace)
if == "" {
return
}
.emit(, ui.Bold)
}
func ( *walker) ( *parse.Primary) {
switch .Type {
case parse.Bareword:
case parse.SingleQuoted, parse.DoubleQuoted:
.emit(, ui.FgYellow)
case parse.List:
if len(.Elements) == 0 {
.emit(, ui.FgRed)
return
}
:= .Elements[0]
, := cmpd.StringLiteral()
if ! {
.emit(, ui.FgRed)
}
switch {
case "re", "and", "or":
.emit(, ui.FgGreen)
default:
.emit(, ui.FgRed)
}
default:
.emit(, ui.FgRed)
}
}