vise/go/vm/input.go

53 lines
1005 B
Go
Raw Normal View History

package vm
import (
"context"
"fmt"
"regexp"
"git.defalsify.org/festive/state"
)
var (
inputRegexStr = "^[a-zA-Z0-9].*$"
inputRegex = regexp.MustCompile(inputRegexStr)
ctrlInputRegexStr = "^[<>_]$"
ctrlInputRegex = regexp.MustCompile(inputRegexStr)
)
func CheckInput(input []byte) error {
if !inputRegex.Match(input) {
return fmt.Errorf("Input '%s' does not match format /%s/", input, inputRegexStr)
}
return nil
}
func applyControlInput(input []byte, st *state.State, ctx context.Context) (string, error) {
var err error
sym, idx := st.Where()
switch input[0] {
case '_':
sym, err = st.Up()
if err != nil {
return sym, err
}
}
_ = idx
return sym, nil
}
func ApplyInput(inputString string, st *state.State, ctx context.Context) (string, error) {
input := []byte(inputString)
if ctrlInputRegex.Match(input) {
return applyControlInput(input, st, ctx)
}
err := CheckInput(input)
if err != nil {
return "", err
}
st.Down(inputString)
return inputString, nil
}