@@ -2,11 +2,13 @@ package root
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "io"
78 "os"
89 "strings"
910
11+ "github.com/charmbracelet/huh"
1012 "github.com/charmbracelet/huh/spinner"
1113 "github.com/gertd/go-pluralize"
1214 "github.com/spf13/cobra"
@@ -19,6 +21,7 @@ import (
1921 "github.com/eunomie/docker-runx/internal/commands/help"
2022 "github.com/eunomie/docker-runx/internal/commands/version"
2123 "github.com/eunomie/docker-runx/internal/constants"
24+ "github.com/eunomie/docker-runx/internal/pizza"
2225 "github.com/eunomie/docker-runx/internal/prompt"
2326 "github.com/eunomie/docker-runx/internal/registry"
2427 "github.com/eunomie/docker-runx/internal/sugar"
@@ -27,10 +30,11 @@ import (
2730)
2831
2932var (
30- docs bool
31- list bool
32- ask bool
33- opts []string
33+ docs bool
34+ list bool
35+ ask bool
36+ opts []string
37+ noFlagCheck bool
3438)
3539
3640func NewCmd (dockerCli command.Cli , isPlugin bool ) * cobra.Command {
@@ -118,7 +122,7 @@ func NewCmd(dockerCli command.Cli, isPlugin bool) *cobra.Command {
118122 if tui .IsATTY (dockerCli .In ().FD ()) && len (rk .Config .Actions ) > 0 {
119123 selectedAction := prompt .SelectAction (rk .Config .Actions )
120124 if selectedAction != "" {
121- return run (cmd .Context (), dockerCli .Err (), src , rk , selectedAction )
125+ return run (cmd .Context (), dockerCli .Err (), src , rk , selectedAction , lc )
122126 }
123127 } else {
124128 _ , _ = fmt .Fprintln (dockerCli .Out (), tui .Markdown (mdActions (rk )))
@@ -127,7 +131,7 @@ func NewCmd(dockerCli command.Cli, isPlugin bool) *cobra.Command {
127131 }
128132
129133 if action != "" {
130- return run (cmd .Context (), dockerCli .Err (), src , rk , action )
134+ return run (cmd .Context (), dockerCli .Err (), src , rk , action , lc )
131135 }
132136
133137 return cmd .Help ()
@@ -168,6 +172,7 @@ func NewCmd(dockerCli command.Cli, isPlugin bool) *cobra.Command {
168172 f .BoolVarP (& list , "list" , "l" , false , "List available actions" )
169173 f .BoolVar (& ask , "ask" , false , "Do not read local configuration option values and always ask them" )
170174 f .StringArrayVar (& opts , "opt" , nil , "Set an option value" )
175+ f .BoolVarP (& noFlagCheck , "yes" , "y" , false , "Do not check flags before running the command" )
171176
172177 return cmd
173178}
@@ -194,7 +199,7 @@ func getValuesLocal(src, action string) map[string]string {
194199 return localOpts
195200}
196201
197- func run (ctx context.Context , out io.Writer , src string , rk * runkit.RunKit , action string ) error {
202+ func run (ctx context.Context , out io.Writer , src string , rk * runkit.RunKit , action string , lc * runkit. LocalConfig ) error {
198203 runnable , cleanup , err := rk .GetRunnable (action )
199204 defer cleanup ()
200205 if err != nil {
@@ -224,13 +229,39 @@ func run(ctx context.Context, out io.Writer, src string, rk *runkit.RunKit, acti
224229 return err
225230 }
226231
227- _ , _ = fmt . Fprintln ( out , tui . Markdown ( fmt .Sprintf (`
232+ mdCommand := fmt .Sprintf (`
228233> **Running the following command:**
229234
230235 %s
231236
232237---
233- ` , runnable .Command )))
238+ ` , runnable .Command )
239+
240+ var flags []string
241+ if ! noFlagCheck && ! lc .AcceptTheRisk {
242+ flags , err = runnable .CheckFlags ()
243+ }
244+ if err != nil {
245+ return err
246+ } else if len (flags ) > 0 {
247+ _ , _ = fmt .Fprintln (out , tui .Markdown (mdCommand + fmt .Sprintf (`
248+ > **Some flags require your attention:**
249+
250+ %s
251+ ` , strings .Join (pizza .Map (flags , func (flag string ) string {
252+ return fmt .Sprintf ("- `%s`" , flag )
253+ }), "\n " ))))
254+ var cont bool
255+ err = huh .NewConfirm ().Title ("Continue?" ).Value (& cont ).Run ()
256+ if err != nil {
257+ return err
258+ }
259+ if ! cont {
260+ return errors .New ("aborted" )
261+ }
262+ } else {
263+ _ , _ = fmt .Fprintln (out , tui .Markdown (mdCommand ))
264+ }
234265
235266 return runnable .Run (ctx )
236267}
0 commit comments