2022-12-31 05:53:24 +00:00
// Copyright © 2022 Roberto Hidalgo <chinampa@un.rob.mx>
// SPDX-License-Identifier: Apache-2.0
package commands
import (
"fmt"
"os"
"strings"
_c "git.rob.mx/nidito/chinampa/internal/constants"
"git.rob.mx/nidito/chinampa/pkg/env"
"git.rob.mx/nidito/chinampa/pkg/runtime"
"git.rob.mx/nidito/chinampa/pkg/statuscode"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
2023-03-20 01:18:10 +00:00
func cobraCommandFullName ( c * cobra . Command ) [ ] string {
name := [ ] string { c . Name ( ) }
if c . HasParent ( ) {
name = append ( cobraCommandFullName ( c . Parent ( ) ) , name ... )
}
return name
}
2022-12-31 05:53:24 +00:00
var Help = & cobra . Command {
Use : _c . HelpCommandName + " [command]" ,
Short : "Display usage information for any command" ,
Long : ` Help provides the valid arguments and options for any command known to ` + runtime . Executable + ` . By default, ﹅ ` + runtime . Executable + ` help﹅ will query the environment variable ﹅COLORFGBG﹅ to decide which style to use when rendering help, except if ﹅ ` + env . HelpUnstyled + ` ﹅ is set. Valid styles are: **light**, **dark**, and **auto**. ` ,
ValidArgsFunction : func ( c * cobra . Command , args [ ] string , toComplete string ) ( [ ] string , cobra . ShellCompDirective ) {
var completions [ ] string
cmd , _ , e := c . Root ( ) . Find ( args )
if e != nil {
return nil , cobra . ShellCompDirectiveNoFileComp
}
if cmd == nil {
// Root help command.
cmd = c . Root ( )
}
for _ , subCmd := range cmd . Commands ( ) {
if subCmd . IsAvailableCommand ( ) || subCmd . Name ( ) == _c . HelpCommandName {
if strings . HasPrefix ( subCmd . Name ( ) , toComplete ) {
completions = append ( completions , fmt . Sprintf ( "%s\t%s" , subCmd . Name ( ) , subCmd . Short ) )
}
}
}
return completions , cobra . ShellCompDirectiveNoFileComp
} ,
Run : func ( c * cobra . Command , args [ ] string ) {
2023-03-20 01:18:10 +00:00
if len ( args ) > 0 && c != nil && c . Name ( ) != args [ len ( args ) - 1 ] {
c , topicArgs , err := c . Root ( ) . Find ( args )
if err == nil && c != nil && len ( topicArgs ) == 0 {
// exact command help
cobra . CheckErr ( c . Help ( ) )
os . Exit ( statuscode . RenderHelp )
return
}
2022-12-31 05:53:24 +00:00
2023-03-20 01:18:10 +00:00
if err != nil {
logrus . Error ( err )
os . Exit ( statuscode . ProgrammerError )
}
2022-12-31 05:53:24 +00:00
2023-03-20 01:18:10 +00:00
fullName := strings . Join ( cobraCommandFullName ( c ) , " " )
cobra . CheckErr ( c . Help ( ) )
if len ( topicArgs ) > 0 {
logrus . Errorf ( "Unknown help topic \"%s\" for %s" , topicArgs [ 0 ] , fullName )
} else {
logrus . Errorf ( "Unknown help topic \"%s\"" , args [ 0 ] )
2022-12-31 05:53:24 +00:00
}
2023-03-20 01:18:10 +00:00
os . Exit ( statuscode . NotFound )
2022-12-31 05:53:24 +00:00
} else {
2023-03-20 01:18:10 +00:00
c . InitDefaultHelpFlag ( ) // make possible 'help' flag to be shown
cobra . CheckErr ( c . Help ( ) )
2022-12-31 05:53:24 +00:00
}
os . Exit ( statuscode . RenderHelp )
} ,
}