package filter

import (
	

	
	
	
	
)

func ( string) (ui.Text, []error) {
	,  := parseFilter()
	 := walker{}
	.walk()
	 := ui.StyleRegions(, .regions)
	// TODO: Add errors.
	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  == "" {
		// Whitespace; nothing to do.
		return
	}
	// Metacharacter; style it bold.
	.emit(, ui.Bold)
}

func ( *walker) ( *parse.Primary) {
	switch .Type {
	case parse.Bareword:
		// Barewords are unstyled.
	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:
		// Unsupported primary type.
		.emit(, ui.FgRed)
	}
}