/ internal / usage / executor.go
executor.go
 1  package usage
 2  
 3  import (
 4  	"flag"
 5  	"slices"
 6  	"strings"
 7  
 8  	"codeflow.dananglin.me.uk/apollo/enbas/internal/info"
 9  )
10  
11  // ExecutorUsageFunc returns the function used to print a command's help page.
12  func ExecutorUsageFunc(name, summary string, flagset *flag.FlagSet) func() {
13  	return func() {
14  		var builder strings.Builder
15  
16  		builder.WriteString("SUMMARY:")
17  		builder.WriteString("\n  " + name + " - " + summary)
18  		builder.WriteString("\n\nUSAGE:")
19  		builder.WriteString("\n  " + info.ApplicationName + " " + name)
20  
21  		flagMap := make(map[string]string)
22  
23  		flagset.VisitAll(func(f *flag.Flag) {
24  			flagMap[f.Name] = f.Usage
25  		})
26  
27  		if len(flagMap) > 0 {
28  			flags := make([]string, len(flagMap))
29  			ind := 0
30  
31  			for f := range flagMap {
32  				flags[ind] = f
33  				ind++
34  			}
35  
36  			slices.Sort(flags)
37  
38  			builder.WriteString(" [flags]")
39  			builder.WriteString("\n\nFLAGS:")
40  
41  			for _, value := range flags {
42  				builder.WriteString("\n  --" + value)
43  				builder.WriteString("\n        " + flagMap[value])
44  			}
45  		}
46  
47  		builder.WriteString("\n")
48  
49  		w := flag.CommandLine.Output()
50  
51  		_, _ = w.Write([]byte(builder.String()))
52  	}
53  }