lang: funcs: core: Add a second panic signature
This modifies the panic feature to accept a boolean or a string. If true or not empty, then it will cause the panic. This makes some of the error code a little less ugly.
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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{
|
||||
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
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
-- main.mcl --
|
||||
# This should not panic.
|
||||
panic(false)
|
||||
panic(false)
|
||||
panic("")
|
||||
panic("")
|
||||
# Empty graph, no output.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
-- main.mcl --
|
||||
# This should not panic.
|
||||
panic(false)
|
||||
panic("")
|
||||
test "hello" {}
|
||||
-- OUTPUT --
|
||||
|
||||
@@ -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
|
||||
|
||||
6
lang/interpret_test/TestAstFunc2/panic3.txtar
Normal file
6
lang/interpret_test/TestAstFunc2/panic3.txtar
Normal file
@@ -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
|
||||
10
lang/interpret_test/TestAstFunc2/panic4.txtar
Normal file
10
lang/interpret_test/TestAstFunc2/panic4.txtar
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user