mirror of
https://github.com/hanzo-fi/numscript.git
synced 2026-10-30 20:54:52 +00:00
46 lines
861 B
Go
46 lines
861 B
Go
package interpreter
|
|
|
|
import "github.com/hanzo-fi/numscript/internal/parser"
|
|
|
|
type argsParser struct {
|
|
parsedArgsCount int
|
|
args []Value
|
|
err InterpreterError
|
|
}
|
|
|
|
func NewArgsParser(args []Value) *argsParser {
|
|
return &argsParser{
|
|
args: args,
|
|
}
|
|
}
|
|
|
|
func parseArg[T any](p *argsParser, r parser.Range, expect func(Value, parser.Range) (T, InterpreterError)) T {
|
|
index := p.parsedArgsCount
|
|
p.parsedArgsCount++
|
|
|
|
if p.err != nil || index >= len(p.args) {
|
|
var default_ T
|
|
return default_
|
|
}
|
|
|
|
arg := p.args[index]
|
|
parsed, err := expect(arg, r)
|
|
if err != nil {
|
|
p.err = err
|
|
var default_ T
|
|
return default_
|
|
}
|
|
return parsed
|
|
}
|
|
|
|
func (p *argsParser) parse() InterpreterError {
|
|
if len(p.args) != p.parsedArgsCount {
|
|
p.err = BadArityErr{
|
|
ExpectedArity: p.parsedArgsCount,
|
|
GivenArguments: len(p.args),
|
|
}
|
|
}
|
|
|
|
return p.err
|
|
}
|