q/src/build/ast/parseSwitch.go

38 lines
833 B
Go

package ast
import (
"git.akyoto.dev/cli/q/src/build/expression"
"git.akyoto.dev/cli/q/src/build/token"
)
// parseSwitch generates the cases inside a switch statement.
func parseSwitch(tokens token.List, source []byte) ([]Case, error) {
var cases []Case
err := EachInstruction(tokens, func(caseTokens token.List) error {
blockStart, _, body, err := block(caseTokens, source)
if err != nil {
return err
}
conditionTokens := caseTokens[:blockStart]
var condition *expression.Expression
if len(conditionTokens) == 1 && conditionTokens[0].Kind == token.Identifier && conditionTokens[0].Text(source) == "_" {
condition = nil
} else {
condition = expression.Parse(conditionTokens)
}
cases = append(cases, Case{
Condition: condition,
Body: body,
})
return nil
})
return cases, err
}