diff --git a/examples/lang/panic/main.mcl b/examples/lang/panic/main.mcl index 93ca063e..9748b452 100644 --- a/examples/lang/panic/main.mcl +++ b/examples/lang/panic/main.mcl @@ -1,4 +1,10 @@ class foo() { + panic(false) # should NOT panic + panic(false) # should NOT panic + panic("") # should NOT panic + panic("") # should NOT panic + panic(true) # should panic + panic(true) # should panic panic("fail3") # should panic panic("fail4") # should panic diff --git a/examples/lang/panic0.mcl b/examples/lang/panic0.mcl index c544f2e2..f9dc724f 100644 --- a/examples/lang/panic0.mcl +++ b/examples/lang/panic0.mcl @@ -1,7 +1,11 @@ import "panic/" as nested # local, relative module to prove it can nest +panic(false) # should NOT panic +panic(false) # should NOT panic panic("") # should NOT panic panic("") # should NOT panic +panic(true) # should panic +panic(true) # should panic panic("fail1") # should panic panic("fail2") # should panic diff --git a/lang/funcs/core/panic_func.go b/lang/funcs/core/panic_func.go index f037f87d..58420f43 100644 --- a/lang/funcs/core/panic_func.go +++ b/lang/funcs/core/panic_func.go @@ -20,23 +20,40 @@ package core import ( "fmt" - "github.com/purpleidea/mgmt/lang/funcs/simple" + "github.com/purpleidea/mgmt/lang/funcs/simplepoly" "github.com/purpleidea/mgmt/lang/types" ) func init() { - simple.Register("panic", &types.FuncValue{ - T: types.NewType("func(x str) bool"), - V: Panic, + simplepoly.Register("panic", []*types.FuncValue{ + { + T: types.NewType("func(x bool) bool"), + V: Panic, + }, + { + T: types.NewType("func(x str) bool"), + V: Panic, + }, }) } -// Panic returns an error when it receives a non-empty string. The error should -// cause the function engine to shutdown. If there's no error, it returns false. +// Panic returns an error when it receives a non-empty string or a true boolean. +// The error should cause the function engine to shutdown. If there's no error, +// it returns false. func Panic(input []types.Value) (types.Value, error) { - if s := input[0].Str(); s != "" { - return nil, fmt.Errorf("panic occurred: %s", s) + switch k := input[0].Type().Kind; k { + case types.KindBool: + if input[0].Bool() { + return nil, fmt.Errorf("bool panic occurred") + } + case types.KindStr: + if s := input[0].Str(); s != "" { + return nil, fmt.Errorf("str panic occurred: %s", s) + } + default: + return nil, fmt.Errorf("unsupported kind: %+v", k) } + return &types.BoolValue{ V: false, }, nil diff --git a/lang/interpret_test/TestAstFunc2/panic0.txtar b/lang/interpret_test/TestAstFunc2/panic0.txtar index 9effebda..62990119 100644 --- a/lang/interpret_test/TestAstFunc2/panic0.txtar +++ b/lang/interpret_test/TestAstFunc2/panic0.txtar @@ -1,5 +1,7 @@ -- main.mcl -- # This should not panic. +panic(false) +panic(false) panic("") panic("") # Empty graph, no output. diff --git a/lang/interpret_test/TestAstFunc2/panic1.txtar b/lang/interpret_test/TestAstFunc2/panic1.txtar index 9cfb87d3..96d0a83d 100644 --- a/lang/interpret_test/TestAstFunc2/panic1.txtar +++ b/lang/interpret_test/TestAstFunc2/panic1.txtar @@ -1,5 +1,6 @@ -- main.mcl -- # This should not panic. +panic(false) panic("") test "hello" {} -- OUTPUT -- diff --git a/lang/interpret_test/TestAstFunc2/panic2.txtar b/lang/interpret_test/TestAstFunc2/panic2.txtar index 137f52d9..eb7e949f 100644 --- a/lang/interpret_test/TestAstFunc2/panic2.txtar +++ b/lang/interpret_test/TestAstFunc2/panic2.txtar @@ -1,6 +1,6 @@ -- main.mcl -- # This should panic! -panic("please panic") +panic(true) test "hello" {} -- OUTPUT -- # err: errStream: func `panic @ 0x0000000000` stopped before it was loaded diff --git a/lang/interpret_test/TestAstFunc2/panic3.txtar b/lang/interpret_test/TestAstFunc2/panic3.txtar new file mode 100644 index 00000000..137f52d9 --- /dev/null +++ b/lang/interpret_test/TestAstFunc2/panic3.txtar @@ -0,0 +1,6 @@ +-- main.mcl -- +# This should panic! +panic("please panic") +test "hello" {} +-- OUTPUT -- +# err: errStream: func `panic @ 0x0000000000` stopped before it was loaded diff --git a/lang/interpret_test/TestAstFunc2/panic4.txtar b/lang/interpret_test/TestAstFunc2/panic4.txtar new file mode 100644 index 00000000..24683a9f --- /dev/null +++ b/lang/interpret_test/TestAstFunc2/panic4.txtar @@ -0,0 +1,10 @@ +-- main.mcl -- +# This should panic! +panic(true) +panic(true) +panic("please panic") +panic("please panic") +panic("please panic!") +test "hello" {} +-- OUTPUT -- +# err: errStream: func `panic @ 0x0000000000` stopped before it was loaded