Added "IsTopLevel"
This commit is contained in:
parent
6315afc542
commit
79947e1813
|
@ -24,6 +24,10 @@ func (ca *CallArgs) Bind(vars ...interface{}) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ca CallArgs) IsTopLevel() bool {
|
||||||
|
return ca.args.ec.parent == nil || ca.args.ec == ca.args.ec.root
|
||||||
|
}
|
||||||
|
|
||||||
func (ca CallArgs) HasSwitch(name string) bool {
|
func (ca CallArgs) HasSwitch(name string) bool {
|
||||||
if ca.args.kwargs == nil {
|
if ca.args.kwargs == nil {
|
||||||
return false
|
return false
|
||||||
|
|
|
@ -214,6 +214,48 @@ func TestCallArgs_Bind(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCallArgs_IsTopLevel(t *testing.T) {
|
||||||
|
t.Run("true if the command is running at the top-level frame", func(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
res := make(map[string]bool)
|
||||||
|
|
||||||
|
inst := ucl.New()
|
||||||
|
inst.SetBuiltin("lvl", func(ctx context.Context, args ucl.CallArgs) (any, error) {
|
||||||
|
var n string
|
||||||
|
if err := args.Bind(&n); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
res[n] = args.IsTopLevel()
|
||||||
|
return nil, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
_, err := inst.Eval(ctx, `lvl "one"`)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, res["one"])
|
||||||
|
|
||||||
|
_, err = inst.Eval(ctx, `echo (lvl "two")`)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, res["two"])
|
||||||
|
|
||||||
|
_, err = inst.Eval(ctx, `proc doLvl { |n| lvl $n } ; doLvl "three"`)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.False(t, res["three"])
|
||||||
|
|
||||||
|
_, err = inst.Eval(ctx, `doLvl "four"`)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.False(t, res["four"])
|
||||||
|
|
||||||
|
_, err = inst.Eval(ctx, `["a"] | map { |x| doLvl "five" ; $x }`)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.False(t, res["five"])
|
||||||
|
|
||||||
|
_, err = inst.Eval(ctx, `if 1 { lvl "six" }`)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, res["six"])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
type doStringable interface {
|
type doStringable interface {
|
||||||
DoString() string
|
DoString() string
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue