diff --git a/cmd/serve/serve.go b/cmd/serve/serve.go index 9321901..79767f8 100644 --- a/cmd/serve/serve.go +++ b/cmd/serve/serve.go @@ -1,6 +1,8 @@ package serve import ( + "os" + "github.com/kardianos/service" "github.com/spf13/cobra" @@ -9,7 +11,11 @@ import ( "github.com/anyproto/anytype-cli/core/serviceprogram" ) -var listenAddress string +var ( + listenAddress string + quietMode bool + verboseMode bool +) func NewServeCmd() *cobra.Command { cmd := &cobra.Command{ @@ -21,11 +27,23 @@ func NewServeCmd() *cobra.Command { } cmd.Flags().StringVar(&listenAddress, "listen-address", config.DefaultAPIAddress, "API listen address in `host:port` format") + cmd.Flags().BoolVarP(&quietMode, "quiet", "q", false, "Suppress most output (only errors)") + cmd.Flags().BoolVarP(&verboseMode, "verbose", "v", false, "Show detailed output (debug level)") + cmd.MarkFlagsMutuallyExclusive("quiet", "verbose") return cmd } func runServer(cmd *cobra.Command, args []string) error { + // Configure anytype-heart log level via environment variables (must be set before server starts) + if quietMode { + os.Setenv("ANYTYPE_LOG_LEVEL", "*=FATAL") + os.Setenv("ANYTYPE_LOG_NOGELF", "1") + } else if verboseMode { + os.Setenv("ANYTYPE_LOG_LEVEL", "*=DEBUG") + } + // Default log level (ERROR) is set in grpcserver/server.go if not specified + svcConfig := &service.Config{ Name: "anytype", DisplayName: "Anytype", diff --git a/cmd/serve/serve_test.go b/cmd/serve/serve_test.go index a08123f..b9eb457 100644 --- a/cmd/serve/serve_test.go +++ b/cmd/serve/serve_test.go @@ -1,6 +1,7 @@ package serve import ( + "strings" "testing" "github.com/anyproto/anytype-cli/core/config" @@ -51,3 +52,55 @@ func TestServeCmd_ListenAddressFlagCustomValue(t *testing.T) { t.Errorf("listen-address value = %v, want %v", flag.Value.String(), customAddr) } } + +func TestServeCmd_QuietFlag(t *testing.T) { + cmd := NewServeCmd() + + flag := cmd.Flag("quiet") + if flag == nil { + t.Fatal("quiet flag not found") + } + + if flag.Shorthand != "q" { + t.Errorf("quiet shorthand = %v, want q", flag.Shorthand) + } + + if flag.DefValue != "false" { + t.Errorf("quiet default = %v, want false", flag.DefValue) + } +} + +func TestServeCmd_VerboseFlag(t *testing.T) { + cmd := NewServeCmd() + + flag := cmd.Flag("verbose") + if flag == nil { + t.Fatal("verbose flag not found") + } + + if flag.Shorthand != "v" { + t.Errorf("verbose shorthand = %v, want v", flag.Shorthand) + } + + if flag.DefValue != "false" { + t.Errorf("verbose default = %v, want false", flag.DefValue) + } +} + +func TestServeCmd_QuietAndVerboseMutuallyExclusive(t *testing.T) { + cmd := NewServeCmd() + cmd.SetArgs([]string{"--quiet", "--verbose"}) + + err := cmd.Execute() + if err == nil { + t.Fatal("expected error when using --quiet and --verbose together") + } + + errMsg := err.Error() + if !strings.Contains(errMsg, "quiet") { + t.Errorf("error message should mention 'quiet' flag, got: %q", errMsg) + } + if !strings.Contains(errMsg, "verbose") { + t.Errorf("error message should mention 'verbose' flag, got: %q", errMsg) + } +}