-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
cmdr.go
139 lines (124 loc) · 3.63 KB
/
cmdr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Copyright © 2022 Hedzr Yeh.
package cmdr
import (
"os"
logz "github.com/hedzr/logg/slog"
"github.com/hedzr/store"
"github.com/hedzr/cmdr/v2/builder"
"github.com/hedzr/cmdr/v2/cli"
"github.com/hedzr/cmdr/v2/cli/worker"
)
// func NewOpt[T any](defaultValue ...T) config.Opt {
// return nil
// }
// New starts a new cmdr app.
//
// With the returned builder.App, you may build root and sub-commands fluently.
//
// app := cmdr.New().
// Info("demo-app", "0.3.1").
// Author("hedzr")
// app.AddCmd(func(b config.CommandBuilder) {
// b.Titles("jump").
// Description("jump command").
// Examples(``).
// Deprecated(``).
// Hidden(false).
// AddCmd(func(b config.CommandBuilder) {
// b.Titles("to").
// Description("to command").
// Examples(``).
// Deprecated(``).
// Hidden(false).
// OnAction(func(cmd *obj.Command, args []string) (err error) {
// return // handling command action here
// }).
// Build()
// }).
// Build()
// }).AddFlg(func(b config.FlagBuilder) {
// b.Titles("dry-run", "n").Default(false).Build()
// })
//
// app.Flg("dry-run", "n").
// Default(false).
// Build() // no matter even if you're adding the duplicated one.
//
// // // simple run the parser of app and trigger the matched command's action
// // _ = app.Run(
// // cmdr.WithForceDefaultAction(false), // true for debug in developing time
// // )
//
// if err := app.Run(
// cmdr.WithForceDefaultAction(false), // true for debug in developing time
// ); err != nil {
// logz.Error("Application Error:", "err", err)
// }
//
// After the root command and all its children are built, use app.[config.App.Run]
// to parse end-user's command-line arguments, and invoke the bound
// action on the hit subcommand.
//
// It is not necessary to attach an action onto a parent command, because
// its subcommands are the main characters - but you still can do that.
func New(opts ...cli.Opt) cli.App {
_ = os.Setenv("CMDR_VERSION", Version)
logz.Verbose("setup env-var at earlier time", "CMDR_VERSION", Version)
cfg := cli.NewConfig(opts...)
w := worker.New(cfg)
return builder.New(w)
}
// App returns a light version of builder.Runner (a.k.a. *worker.Worker).
//
// Generally it's a unique instance in one system.
//
// It's available once New() / Exec() called, else nil.
func App() cli.Runner { return worker.UniqueWorker() }
// Exec starts a new cmdr app (parsing cmdline args based on the given rootCmd)
// from scratch.
//
// It's a reserved API for back-compatible with cmdr v1.
//
// It'll be removed completely at the recently future version.
//
// Deprecated since 2.1
func Exec(rootCmd *cli.RootCommand, opts ...cli.Opt) (err error) {
// if is.InDebugging() {
// _ = exec.Run("/bin/false")
// // cabin.Version()
// // cpcn.Out()
// }
app := New(opts...).SetRootCommand(rootCmd)
err = app.Run()
return
}
func WithForceDefaultAction(b bool) cli.Opt {
return func(s *cli.Config) {
s.ForceDefaultAction = b
}
}
func WithUnmatchedAsError(b bool) cli.Opt {
return func(s *cli.Config) {
s.UnmatchedAsError = b
}
}
func WithStore(conf store.Store) cli.Opt {
return func(s *cli.Config) {
s.Store = conf
}
}
func WithExternalLoaders(loaders ...cli.Loader) cli.Opt {
return func(s *cli.Config) {
s.Loaders = loaders
}
}
func WithTasksBeforeParse(tasks ...cli.Task) cli.Opt {
return func(s *cli.Config) {
s.TasksBeforeParse = tasks
}
}
func WithTasksBeforeRun(tasks ...cli.Task) cli.Opt {
return func(s *cli.Config) {
s.TasksBeforeRun = tasks
}
}