Added 'error' and 'assert' builtins
Some checks failed
Test / build (push) Failing after 1m7s

This commit is contained in:
Leon Mika 2025-05-19 22:04:09 +10:00
parent 7ca821016e
commit 53b05b5ba6
3 changed files with 36 additions and 0 deletions

View file

@ -1103,6 +1103,31 @@ func returnBuiltin(ctx context.Context, args invocationArgs) (Object, error) {
return nil, errReturn{ret: args.args[0]} return nil, errReturn{ret: args.args[0]}
} }
// TODO - add tests
func errorBuiltin(ctx context.Context, args invocationArgs) (Object, error) {
if len(args.args) < 1 {
return nil, errors.New("need at least one arguments")
}
return nil, ErrRuntime{args.args[0].String()}
}
func assertBuiltin(ctx context.Context, args invocationArgs) (Object, error) {
if len(args.args) < 1 {
return nil, errors.New("need at least one arguments")
}
if isTruthy(args.args[0]) {
return nil, nil
}
if len(args.args) > 1 {
return nil, ErrRuntime{args.args[1].String()}
}
return nil, ErrRuntime{"assertion failed"}
}
func procBuiltin(ctx context.Context, args macroArgs) (Object, error) { func procBuiltin(ctx context.Context, args macroArgs) (Object, error) {
if args.nargs() < 1 { if args.nargs() < 1 {
return nil, errors.New("need at least one arguments") return nil, errors.New("need at least one arguments")

View file

@ -96,6 +96,9 @@ func New(opts ...InstOption) *Inst {
rootEC.addCmd("continue", invokableFunc(continueBuiltin)) rootEC.addCmd("continue", invokableFunc(continueBuiltin))
rootEC.addCmd("return", invokableFunc(returnBuiltin)) rootEC.addCmd("return", invokableFunc(returnBuiltin))
rootEC.addCmd("error", invokableFunc(errorBuiltin))
rootEC.addCmd("assert", invokableFunc(assertBuiltin))
rootEC.addMacro("if", macroFunc(ifBuiltin)) rootEC.addMacro("if", macroFunc(ifBuiltin))
rootEC.addMacro("foreach", macroFunc(foreachBuiltin)) rootEC.addMacro("foreach", macroFunc(foreachBuiltin))
rootEC.addMacro("for", macroFunc(foreachBuiltin)) rootEC.addMacro("for", macroFunc(foreachBuiltin))

View file

@ -643,6 +643,14 @@ func (p OpaqueObject) Truthy() bool {
return p.v != nil return p.v != nil
} }
type ErrRuntime struct {
errStr string
}
func (e ErrRuntime) Error() string {
return e.errStr
}
type errBreak struct { type errBreak struct {
isCont bool isCont bool
ret Object ret Object