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:
James Shubin
2023-11-28 14:43:39 -05:00
parent 9c0bde0b29
commit 8251c8f259
8 changed files with 55 additions and 9 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,5 +1,7 @@
-- main.mcl --
# This should not panic.
panic(false)
panic(false)
panic("")
panic("")
# Empty graph, no output.

View File

@@ -1,5 +1,6 @@
-- main.mcl --
# This should not panic.
panic(false)
panic("")
test "hello" {}
-- OUTPUT --

View File

@@ -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

View 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

View 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