+9
-5
@@ -809,18 +809,22 @@ func (c *Context) RunNode(node *Node, binds ...interface{}) (err error) {
|
|||||||
func (c *Context) Run(binds ...interface{}) (err error) {
|
func (c *Context) Run(binds ...interface{}) (err error) {
|
||||||
node := c.Selected()
|
node := c.Selected()
|
||||||
if node == nil {
|
if node == nil {
|
||||||
if len(c.Path) > 0 {
|
if len(c.Path) == 0 {
|
||||||
|
return fmt.Errorf("no command selected")
|
||||||
|
}
|
||||||
selected := c.Path[0].Node()
|
selected := c.Path[0].Node()
|
||||||
if selected.Type == ApplicationNode {
|
if selected.Type == ApplicationNode {
|
||||||
method := getMethod(selected.Target, "Run")
|
method := getMethod(selected.Target, "Run")
|
||||||
if method.IsValid() {
|
if method.IsValid() {
|
||||||
return c.RunNode(selected, binds...)
|
node = selected
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
return fmt.Errorf("no command selected")
|
return fmt.Errorf("no command selected")
|
||||||
}
|
}
|
||||||
return c.RunNode(node, binds...)
|
}
|
||||||
|
runErr := c.RunNode(node, binds...)
|
||||||
|
err = c.Kong.applyHook(c, "AfterRun")
|
||||||
|
return errors.Join(runErr, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PrintUsage to Kong's stdout.
|
// PrintUsage to Kong's stdout.
|
||||||
|
|||||||
@@ -7,4 +7,4 @@ require (
|
|||||||
|
|
||||||
require github.com/hexops/gotextdiff v1.0.3 // indirect
|
require github.com/hexops/gotextdiff v1.0.3 // indirect
|
||||||
|
|
||||||
go 1.18
|
go 1.20
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
github.com/alecthomas/assert/v2 v2.10.0 h1:jjRCHsj6hBJhkmhznrCzoNpbA3zqy0fYiUcYZP/GkPY=
|
|
||||||
github.com/alecthomas/assert/v2 v2.10.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
|
||||||
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
|
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
|
||||||
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
||||||
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
|
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
|
||||||
|
|||||||
@@ -3,17 +3,24 @@ package kong
|
|||||||
// BeforeResolve is a documentation-only interface describing hooks that run before resolvers are applied.
|
// BeforeResolve is a documentation-only interface describing hooks that run before resolvers are applied.
|
||||||
type BeforeResolve interface {
|
type BeforeResolve interface {
|
||||||
// This is not the correct signature - see README for details.
|
// This is not the correct signature - see README for details.
|
||||||
BeforeResolve(args ...interface{}) error
|
BeforeResolve(args ...any) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// BeforeApply is a documentation-only interface describing hooks that run before values are set.
|
// BeforeApply is a documentation-only interface describing hooks that run before values are set.
|
||||||
type BeforeApply interface {
|
type BeforeApply interface {
|
||||||
// This is not the correct signature - see README for details.
|
// This is not the correct signature - see README for details.
|
||||||
BeforeApply(args ...interface{}) error
|
BeforeApply(args ...any) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// AfterApply is a documentation-only interface describing hooks that run after values are set.
|
// AfterApply is a documentation-only interface describing hooks that run after values are set.
|
||||||
type AfterApply interface {
|
type AfterApply interface {
|
||||||
// This is not the correct signature - see README for details.
|
// This is not the correct signature - see README for details.
|
||||||
AfterApply(args ...interface{}) error
|
AfterApply(args ...any) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// AfterRun is a documentation-only interface describing hooks that run after Run() returns.
|
||||||
|
type AfterRun interface {
|
||||||
|
// This is not the correct signature - see README for details.
|
||||||
|
// AfterRun is called after Run() returns.
|
||||||
|
AfterRun(args ...any) error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2327,3 +2327,28 @@ func TestRecursiveVariableExpansion(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, w.String(), "Default: /etc/config")
|
assert.Contains(t, w.String(), "Default: /etc/config")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type afterRunCLI struct {
|
||||||
|
runCalled bool `kong:"-"`
|
||||||
|
afterRunCalled bool `kong:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *afterRunCLI) Run() error {
|
||||||
|
c.runCalled = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *afterRunCLI) AfterRun() error {
|
||||||
|
c.afterRunCalled = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAfterRun(t *testing.T) {
|
||||||
|
var cli afterRunCLI
|
||||||
|
k := mustNew(t, &cli)
|
||||||
|
kctx, err := k.Parse([]string{})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
err = kctx.Run()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, afterRunCLI{runCalled: true, afterRunCalled: true}, cli)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user