diff --git a/example/cmd/config/main.go b/example/cmd/config/main.go
index 878fde5..22732a7 100644
--- a/example/cmd/config/main.go
+++ b/example/cmd/config/main.go
@@ -2,6 +2,7 @@ package main
import (
"context"
+ "os"
"gitoa.ru/go-4devs/config/provider/arg"
"gitoa.ru/go-4devs/config/provider/chain"
@@ -22,7 +23,7 @@ func main() {
console.
New(console.WithInput(
chain.New(
- arg.New(arg.WithSkip(0)),
+ arg.New(arg.WithArgs(os.Args)),
env.New(Namespace, AppName),
&memory.Default{},
),
diff --git a/example/go.mod b/example/go.mod
index c3f0ff8..f55aeee 100644
--- a/example/go.mod
+++ b/example/go.mod
@@ -1,10 +1,10 @@
module gitoa.ru/go-4devs/console/example
-go 1.23
+go 1.24.0
toolchain go1.24.1
require (
- gitoa.ru/go-4devs/config v0.0.7
- gitoa.ru/go-4devs/console v0.2.0
+ gitoa.ru/go-4devs/config v0.0.8
+ gitoa.ru/go-4devs/console v0.2.1-0.20260105202444-e2c6fc0a35a4
)
diff --git a/example/go.sum b/example/go.sum
index 3450563..2cf2b51 100644
--- a/example/go.sum
+++ b/example/go.sum
@@ -1,4 +1,6 @@
-gitoa.ru/go-4devs/config v0.0.7 h1:8q6axRNLgXE5dYQd8Jbh9j+STqevbibVyvwrtsuHpZk=
-gitoa.ru/go-4devs/config v0.0.7/go.mod h1:UINWnObZA0nLiJro+TtavUBBvN0cSt17aRHOk20pP74=
+gitoa.ru/go-4devs/config v0.0.8 h1:o4p8I9jWJMfiFVVKr50IqCGj1fF+8kmSPDkH0deRvn4=
+gitoa.ru/go-4devs/config v0.0.8/go.mod h1:jHKqVafFVW400LC0M4i1ifPapiI9sqpX/QTh+VMadKw=
gitoa.ru/go-4devs/console v0.2.0 h1:6lsbArs99GA8vGdnwNDThZNKjFNctNtTlSCUjhgwIpU=
gitoa.ru/go-4devs/console v0.2.0/go.mod h1:xi4Svw7T+lylckAQiJQS/2qwDwF4YbIanlhcbQrBAiI=
+gitoa.ru/go-4devs/console v0.2.1-0.20260105202444-e2c6fc0a35a4 h1:zOk/59IvgUfCDL6ub6WX4hsqDK79FsZR0gf7s7t3fXM=
+gitoa.ru/go-4devs/console v0.2.1-0.20260105202444-e2c6fc0a35a4/go.mod h1:PG/Zyj1dLh7eFlj9bgnV58+Ys6I/MTrS0q9W7oD7z4U=
diff --git a/example/pkg/command/args.go b/example/pkg/command/args.go
index 6dcfebe..dfc1459 100644
--- a/example/pkg/command/args.go
+++ b/example/pkg/command/args.go
@@ -7,32 +7,37 @@ import (
"gitoa.ru/go-4devs/config"
"gitoa.ru/go-4devs/config/definition/option"
"gitoa.ru/go-4devs/console"
+ "gitoa.ru/go-4devs/console/command"
"gitoa.ru/go-4devs/console/output"
)
-func Args() *console.Command {
- return &console.Command{
- Name: "fdevs:console:arg",
- Description: "Understanding how Console Arguments and Options Are Handled",
- Configure: func(_ context.Context, def config.Definition) error {
- def.Add(
- option.Bool("foo", "foo option", option.Short('f')),
- option.String("bar", "required bar option", option.Required, option.Short('b')),
- option.String("cat", "cat option", option.Short('c')),
- option.Time("time", "time example"),
- option.Time("hidden", "hidden time example", option.Hidden),
- )
-
- return nil
- },
- Execute: func(ctx context.Context, in config.Provider, out output.Output) error {
- out.Println(ctx, "foo: ", console.ReadValue(ctx, in, "foo").Bool(), "")
- out.Println(ctx, "bar: ", console.ReadValue(ctx, in, "bar").String(), "")
- out.Println(ctx, "cat: ", console.ReadValue(ctx, in, "cat").String(), "")
- out.Println(ctx, "time: ", console.ReadValue(ctx, in, "time").Time().Format(time.RFC3339), "")
- out.Println(ctx, "hidden: ", console.ReadValue(ctx, in, "hidden").Time().Format(time.RFC3339), "")
-
- return nil
- },
- }
+func Args() command.Command {
+ return command.New(
+ "fdevs:console:arg",
+ "Understanding how Console Arguments and Options Are Handled",
+ ArgExecute,
+ command.Configure(ArgConfigure),
+ )
+}
+
+func ArgConfigure(_ context.Context, def config.Definition) error {
+ def.Add(
+ option.Bool("foo", "foo option", option.Short('f')),
+ option.String("bar", "required bar option", option.Required, option.Short('b')),
+ option.String("cat", "cat option", option.Short('c')),
+ option.Time("time", "time example"),
+ option.Time("hidden", "hidden time example", option.Hidden),
+ )
+
+ return nil
+}
+
+func ArgExecute(ctx context.Context, in config.Provider, out output.Output) error {
+ out.Println(ctx, "foo: ", console.ReadValue(ctx, in, "foo").Bool(), "")
+ out.Println(ctx, "bar: ", console.ReadValue(ctx, in, "bar").String(), "")
+ out.Println(ctx, "cat: ", console.ReadValue(ctx, in, "cat").String(), "")
+ out.Println(ctx, "time: ", console.ReadValue(ctx, in, "time").Time().Format(time.RFC3339), "")
+ out.Println(ctx, "hidden: ", console.ReadValue(ctx, in, "hidden").Time().Format(time.RFC3339), "")
+
+ return nil
}
diff --git a/example/pkg/command/create_user.go b/example/pkg/command/create_user.go
index a4ab923..e3205f3 100644
--- a/example/pkg/command/create_user.go
+++ b/example/pkg/command/create_user.go
@@ -5,37 +5,47 @@ import (
"gitoa.ru/go-4devs/config"
"gitoa.ru/go-4devs/config/definition/option"
- "gitoa.ru/go-4devs/config/param"
+ cparam "gitoa.ru/go-4devs/config/param"
argument "gitoa.ru/go-4devs/config/provider/arg"
"gitoa.ru/go-4devs/console"
+ "gitoa.ru/go-4devs/console/command"
"gitoa.ru/go-4devs/console/output"
+ "gitoa.ru/go-4devs/console/param"
)
-func CreateUser(required bool) *console.Command {
- return &console.Command{
- Name: "app:create-user",
- Description: "Creates a new user.",
- Help: "This command allows you to create a user...",
- Configure: func(_ context.Context, cfg config.Definition) error {
- var opts []param.Option
- if required {
- opts = append(opts, option.Required)
- }
+func CreateUser(required bool) command.Command {
+ return command.New(
+ "app:create-user",
+ "Creates a new user.",
+ UserExecute,
+ command.Configure(UserConfigure(required)),
+ command.Help(func(param.HData) (string, error) {
+ return "This command allows you to create a user...", nil
+ }),
+ )
+}
- cfg.
- Add(
- argument.String("username", "The username of the user.", option.Required),
- argument.String("password", "User password", opts...),
- )
+func UserConfigure(required bool) func(_ context.Context, cfg config.Definition) error {
+ return func(_ context.Context, cfg config.Definition) error {
+ var opts []cparam.Option
+ if required {
+ opts = append(opts, option.Required)
+ }
- return nil
- },
- Execute: func(ctx context.Context, in config.Provider, out output.Output) error {
- // outputs a message followed by a "\n"
- out.Println(ctx, "User Creator")
- out.Println(ctx, "Username: ", console.ReadValue(ctx, in, "username").String())
+ cfg.
+ Add(
+ argument.String("username", "The username of the user.", option.Required),
+ argument.String("password", "User password", opts...),
+ )
- return nil
- },
+ return nil
}
}
+
+func UserExecute(ctx context.Context, in config.Provider, out output.Output) error {
+ // outputs a message followed by a "\n"
+ out.Println(ctx, "User Creator")
+ out.Println(ctx, "Username: ", console.ReadValue(ctx, in, "username").String())
+
+ return nil
+}
diff --git a/example/pkg/command/hello.go b/example/pkg/command/hello.go
index 4fef561..c8d46a6 100644
--- a/example/pkg/command/hello.go
+++ b/example/pkg/command/hello.go
@@ -7,33 +7,38 @@ import (
"gitoa.ru/go-4devs/config/definition/option"
"gitoa.ru/go-4devs/config/provider/arg"
"gitoa.ru/go-4devs/console"
+ "gitoa.ru/go-4devs/console/command"
"gitoa.ru/go-4devs/console/output"
)
-func Hello() *console.Command {
- return &console.Command{
- Name: "fdevs:console:hello",
- Description: "example hello command",
- Execute: func(ctx context.Context, in config.Provider, out output.Output) error {
- name := console.ReadValue(ctx, in, "name").String()
- out.Println(ctx, "Hello ", name, "")
-
- out.Info(ctx, "same trace info\n")
- out.Debug(ctx, "have some question?\n")
- out.Trace(ctx, "this message shows with -vvv\n")
-
- pass := console.ReadValue(ctx, in, "pass").String()
- out.Println(ctx, "hidden option pass ", pass, "")
-
- return nil
- },
- Configure: func(_ context.Context, def config.Definition) error {
- def.Add(
- arg.String("name", "Same name", arg.Default("World")),
- option.String("pass", "password", option.Hidden),
- )
-
- return nil
- },
- }
+func Hello() command.Command {
+ return command.New(
+ "fdevs:console:hello",
+ "example hello command",
+ HelloExecute,
+ command.Configure(HelloConfigure),
+ )
+}
+
+func HelloExecute(ctx context.Context, in config.Provider, out output.Output) error {
+ name := console.ReadValue(ctx, in, "name").String()
+ out.Println(ctx, "Hello ", name, "")
+
+ out.Info(ctx, "same trace info\n")
+ out.Debug(ctx, "have some question?\n")
+ out.Trace(ctx, "this message shows with -vvv\n")
+
+ pass := console.ReadValue(ctx, in, "pass").String()
+ out.Println(ctx, "hidden option pass ", pass, "")
+
+ return nil
+}
+
+func HelloConfigure(_ context.Context, def config.Definition) error {
+ def.Add(
+ arg.String("name", "Same name", arg.Default("World")),
+ option.String("pass", "password", option.Hidden),
+ )
+
+ return nil
}
diff --git a/example/pkg/command/hidden.go b/example/pkg/command/hidden.go
index 15e6900..764c4bd 100644
--- a/example/pkg/command/hidden.go
+++ b/example/pkg/command/hidden.go
@@ -4,19 +4,16 @@ import (
"context"
"gitoa.ru/go-4devs/config"
- "gitoa.ru/go-4devs/console"
+ "gitoa.ru/go-4devs/console/command"
"gitoa.ru/go-4devs/console/output"
)
-func Hidden() *console.Command {
- return &console.Command{
- Name: "fdevs:console:hidden",
- Description: "hidden command exmale",
- Hidden: true,
- Execute: func(ctx context.Context, _ config.Provider, out output.Output) error {
- out.Println(ctx, " call hidden command")
-
- return nil
- },
- }
+func Hidden() command.Command {
+ return command.New("fdevs:console:hidden", "hidden command exmale", HiddenExecute, command.Hidden)
+}
+
+func HiddenExecute(ctx context.Context, _ config.Provider, out output.Output) error {
+ out.Println(ctx, " call hidden command")
+
+ return nil
}
diff --git a/example/pkg/command/long.go b/example/pkg/command/long.go
index 46885c9..b50dcf3 100644
--- a/example/pkg/command/long.go
+++ b/example/pkg/command/long.go
@@ -9,45 +9,46 @@ import (
"gitoa.ru/go-4devs/config/validator"
"gitoa.ru/go-4devs/config/value"
"gitoa.ru/go-4devs/console"
+ "gitoa.ru/go-4devs/console/command"
"gitoa.ru/go-4devs/console/output"
)
const defaultTimeout = time.Second * 30
// Long example of a command that takes a long time to run.
-func Long() *console.Command {
- return &console.Command{
- Name: "fdevs:command:long",
- Execute: func(ctx context.Context, in config.Provider, out output.Output) error {
- timeout := console.ReadValue(ctx, in, "timeout").Duration()
- timer := time.NewTimer(timeout)
+func Long() command.Command {
+ return command.New("fdevs:command:long", "long command description", LongExecute, command.Configure(LongConfigure))
+}
- ticker := time.NewTicker(time.Second)
- defer ticker.Stop()
+func LongExecute(ctx context.Context, in config.Provider, out output.Output) error {
+ timeout := console.ReadValue(ctx, in, "timeout").Duration()
+ timer := time.NewTimer(timeout)
- for {
- select {
- case t := <-ticker.C:
- out.Println(ctx, "ticker: ", t, "")
- case <-timer.C:
- out.Println(ctx, "stop timer")
+ ticker := time.NewTicker(time.Second)
+ defer ticker.Stop()
- return nil
- case <-ctx.Done():
- out.Println(ctx, "cancel context")
-
- return nil
- }
- }
- },
- Configure: func(_ context.Context, def config.Definition) error {
- def.Add(option.Duration("timeout", "set duration run command",
- option.Default(value.New(defaultTimeout)),
- option.Short('t'),
- validator.Valid(validator.NotBlank),
- ))
+ for {
+ select {
+ case t := <-ticker.C:
+ out.Println(ctx, "ticker: ", t, "")
+ case <-timer.C:
+ out.Println(ctx, "stop timer")
return nil
- },
+ case <-ctx.Done():
+ out.Println(ctx, "cancel context")
+
+ return nil
+ }
}
}
+
+func LongConfigure(_ context.Context, def config.Definition) error {
+ def.Add(option.Duration("timeout", "set duration run command",
+ option.Default(value.New(defaultTimeout)),
+ option.Short('t'),
+ validator.Valid(validator.NotBlank),
+ ))
+
+ return nil
+}
diff --git a/example/pkg/command/namespace.go b/example/pkg/command/namespace.go
index 44c192b..4278f74 100644
--- a/example/pkg/command/namespace.go
+++ b/example/pkg/command/namespace.go
@@ -4,18 +4,16 @@ import (
"context"
"gitoa.ru/go-4devs/config"
- "gitoa.ru/go-4devs/console"
+ "gitoa.ru/go-4devs/console/command"
"gitoa.ru/go-4devs/console/output"
)
-func Namespace() *console.Command {
- return &console.Command{
- Name: "app:start",
- Description: "example command in other namespace",
- Execute: func(ctx context.Context, _ config.Provider, out output.Output) error {
- out.Println(ctx, "example command in other namespace")
-
- return nil
- },
- }
+func Namespace() command.Command {
+ return command.New("app:start", "example command in other namespace", NSExecute)
+}
+
+func NSExecute(ctx context.Context, _ config.Provider, out output.Output) error {
+ out.Println(ctx, "example command in other namespace")
+
+ return nil
}