141 lines
3.2 KiB
Go
141 lines
3.2 KiB
Go
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
|
|
"code.icb4dc0.de/buildr/buildr/internal/slices"
|
|
"code.icb4dc0.de/buildr/buildr/modules"
|
|
|
|
"code.icb4dc0.de/buildr/buildr/internal/config"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var _ flag.Value = (*PagerColor)(nil)
|
|
|
|
type PagerColor string
|
|
|
|
func (p *PagerColor) String() string {
|
|
s := string(*p)
|
|
if s == "" {
|
|
return string(PagerColorAuto)
|
|
}
|
|
|
|
return s
|
|
}
|
|
|
|
func (p *PagerColor) Set(s string) error {
|
|
switch s {
|
|
case "":
|
|
fallthrough
|
|
case "auto":
|
|
*p = PagerColorAuto
|
|
case "always":
|
|
*p = PagerColorAlways
|
|
case "never":
|
|
*p = PagerColorNever
|
|
default:
|
|
return fmt.Errorf("value %q is not a valid PagerColor", s)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
PagerColorAuto PagerColor = "auto"
|
|
PagerColorAlways PagerColor = "always"
|
|
PagerColorNever PagerColor = "never"
|
|
)
|
|
|
|
type ManConfig struct {
|
|
ColorOutput PagerColor
|
|
PagerCommand string
|
|
}
|
|
|
|
func (m *ManConfig) Flags() *flag.FlagSet {
|
|
fs := flag.NewFlagSet("man", flag.ExitOnError)
|
|
|
|
fs.StringVar(&m.PagerCommand, "pager.command", config.StringEnvOr("BUILDR_PAGER", ""), "pager command - e.g. bat -l md")
|
|
fs.Var(&m.ColorOutput, "pager.color", "Whether to use colorized output or not - auto means it won't colorize when using an external pager")
|
|
|
|
return fs
|
|
}
|
|
|
|
func (m *ManConfig) Pager(ctx context.Context, title string) (Pager, error) {
|
|
switch m.PagerCommand {
|
|
case "":
|
|
return NewTUIPager(title)
|
|
default:
|
|
return NewCmdPager(ctx, m.PagerCommand, m.ColorOutput == PagerColorAlways)
|
|
}
|
|
}
|
|
|
|
func ModuleManCommand(
|
|
category modules.Category,
|
|
cmder ManCommander,
|
|
initializer LevelInitializer,
|
|
argsProvider KnownModulesArgProvider,
|
|
manCfg *ManConfig,
|
|
) *cobra.Command {
|
|
return &cobra.Command{
|
|
Use: modules.CategoryName(category),
|
|
Short: fmt.Sprintf("Show manual pages for %s modules", modules.CategoryName(category)),
|
|
SilenceUsage: true,
|
|
SilenceErrors: true,
|
|
Args: cobra.ExactArgs(1),
|
|
ValidArgsFunction: argsProvider.ValidModulesArgs,
|
|
RunE: func(cmd *cobra.Command, args []string) (err error) {
|
|
if err := initializer.InitAt(cmd.Context(), InitLevelBuildRConfig); err != nil {
|
|
return err
|
|
}
|
|
|
|
p, err := manCfg.Pager(cmd.Context(), fmt.Sprintf("Manual - %s/%s", modules.CategoryName(category), args[0]))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return cmder.DisplayModuleManual(cmd.Context(), p, category, args[0])
|
|
},
|
|
}
|
|
}
|
|
|
|
func ManCmd(
|
|
cmder ManCommander,
|
|
initializer LevelInitializer,
|
|
registryAcc TypeRegistryAccessor,
|
|
) *cobra.Command {
|
|
var manCfg ManConfig
|
|
manCmd := &cobra.Command{
|
|
Use: "man",
|
|
Short: "Show manual pages",
|
|
SilenceUsage: true,
|
|
SilenceErrors: true,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
if err := initializer.InitAt(cmd.Context(), InitLevelBuildRConfig); err != nil {
|
|
return err
|
|
}
|
|
|
|
p, err := manCfg.Pager(cmd.Context(), "Manual - modules")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return cmder.DisplayModulesManual(p)
|
|
},
|
|
}
|
|
|
|
manCmd.AddCommand(slices.Map(modules.Categories(), func(c modules.Category) *cobra.Command {
|
|
return ModuleManCommand(
|
|
c,
|
|
cmder,
|
|
initializer,
|
|
ModulesArgsProviderFor(initializer, registryAcc, c),
|
|
&manCfg,
|
|
)
|
|
})...)
|
|
|
|
manCmd.PersistentFlags().AddGoFlagSet(manCfg.Flags())
|
|
|
|
return manCmd
|
|
}
|