Skip to content

Commit b937339

Browse files
mirkoCrobumirkoCrobu
authored andcommitted
ref: refactoring cli log system
1 parent 64eaa62 commit b937339

File tree

4 files changed

+46
-45
lines changed

4 files changed

+46
-45
lines changed

cmd/arduino-app-cli/app/start.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ func startHandler(ctx context.Context, app app.ArduinoApp) error {
4646
switch message.GetType() {
4747
case orchestrator.ProgressType:
4848
feedback.Progress(message.GetProgress().Progress)
49+
case orchestrator.MinimalType:
50+
feedback.Minimal(message.GetData())
4951
case orchestrator.InfoType:
5052
feedback.Info(message.GetData())
5153
case orchestrator.DebugType:

cmd/arduino-app-cli/main.go

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package main
22

33
import (
44
"context"
5-
"fmt"
65
"log/slog"
7-
"strings"
86

97
"github.com/spf13/cobra"
108
"go.bug.st/cleanup"
@@ -26,7 +24,8 @@ import (
2624
// Version will be set a build time with -ldflags
2725
var Version string = "0.0.0-dev"
2826
var format string
29-
var logLevel string
27+
var quiet bool
28+
var verbose int
3029

3130
func run() error {
3231
defer func() { _ = servicelocator.CloseDockerClient() }()
@@ -36,27 +35,38 @@ func run() error {
3635
Short: "A CLI to manage the Python app",
3736
PersistentPreRun: func(cmd *cobra.Command, args []string) {
3837

39-
level, ok := feedback.ParseLogLevel(logLevel)
40-
if !ok {
41-
feedback.Fatal(i18n.Tr("Invalid log level : %s", logLevel), feedback.ErrBadArgument)
38+
if quiet {
39+
feedback.SetLogLevel(feedback.LogLevelQuiet)
40+
slog.SetLogLoggerLevel(slog.LevelError)
41+
} else {
42+
switch verbose {
43+
case 0:
44+
feedback.SetLogLevel(feedback.LogLevelMinimal)
45+
slog.SetLogLoggerLevel(slog.LevelInfo)
46+
case 1:
47+
feedback.SetLogLevel(feedback.LogLevelInfo)
48+
slog.SetLogLoggerLevel(slog.LevelInfo)
49+
default:
50+
feedback.SetLogLevel(feedback.LogLevelDebug)
51+
slog.SetLogLoggerLevel(slog.LevelDebug)
52+
}
4253
}
43-
feedback.SetLogLevel(level)
4454

4555
format, ok := feedback.ParseOutputFormat(format)
4656
if !ok {
4757
feedback.Fatal(i18n.Tr("Invalid output format: %s", format), feedback.ErrBadArgument)
4858
}
4959
feedback.SetFormat(format)
5060

51-
ConfigureSLogger(logLevel)
52-
5361
},
5462
SilenceUsage: true,
5563
SilenceErrors: true,
5664
}
5765

5866
rootCmd.PersistentFlags().StringVar(&format, "format", "text", "Output format (text, json)")
59-
rootCmd.PersistentFlags().StringVar(&logLevel, "log-level", "info", "Set log level (quiet, info, debug/verbose)")
67+
rootCmd.PersistentFlags().BoolVarP(&quiet, "quiet", "q", false, "Suppress all logs")
68+
rootCmd.PersistentFlags().CountVarP(&verbose, "verbose", "v", "Enable verbose logging (-v for info, -vv for debug)")
69+
rootCmd.MarkFlagsMutuallyExclusive("quiet", "verbose")
6070

6171
rootCmd.AddCommand(
6272
app.NewAppCmd(),
@@ -84,26 +94,3 @@ func main() {
8494
feedback.FatalError(err, 1)
8595
}
8696
}
87-
88-
func ParseLogLevel(level string) (slog.Level, error) {
89-
var l slog.Level
90-
err := l.UnmarshalText([]byte(level))
91-
if err != nil {
92-
return 0, fmt.Errorf("invalid log level: %w", err)
93-
}
94-
return l, nil
95-
}
96-
97-
func ConfigureSLogger(levelStr string) {
98-
var slogLevel slog.Level
99-
100-
switch strings.ToLower(levelStr) {
101-
case "quiet":
102-
slogLevel = slog.LevelError
103-
case "debug", "verbose":
104-
slogLevel = slog.LevelDebug
105-
default:
106-
slogLevel = slog.LevelInfo
107-
}
108-
slog.SetLogLoggerLevel(slogLevel)
109-
}

cmd/feedback/feedback.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,11 +235,12 @@ type LogLevel int
235235

236236
const (
237237
LogLevelQuiet LogLevel = iota
238+
LogLevelMinimal
238239
LogLevelInfo
239240
LogLevelDebug
240241
)
241242

242-
var logLevel LogLevel = LogLevelInfo
243+
var logLevel LogLevel = LogLevelMinimal
243244

244245
func SetLogLevel(level LogLevel) {
245246
logLevel = level
@@ -249,33 +250,42 @@ func ParseLogLevel(levelStr string) (LogLevel, bool) {
249250
switch strings.ToLower(levelStr) {
250251
case "quiet":
251252
return LogLevelQuiet, true
253+
case "minimal":
254+
return LogLevelMinimal, true
252255
case "info":
253256
return LogLevelInfo, true
254257
case "debug", "verbose":
255258
return LogLevelDebug, true
256259
}
257-
return LogLevelInfo, false
260+
return LogLevelMinimal, false
261+
}
262+
263+
func Minimal(message string) {
264+
if logLevel < LogLevelMinimal {
265+
return
266+
}
267+
printLogMessage("step", message)
258268
}
259269

260270
func Info(message string) {
261271
if logLevel < LogLevelInfo {
262272
return
263273
}
264-
printLogMessage("[INFO]", message)
274+
printLogMessage("info", message)
265275
}
266276

267277
func Debug(message string) {
268278
if logLevel < LogLevelDebug {
269279
return
270280
}
271-
printLogMessage("[DEBUG]", message)
281+
printLogMessage("debug", message)
272282
}
273283

274284
func Warning(message string) {
275285
if logLevel < LogLevelInfo {
276286
return
277287
}
278-
printLogMessage("[WARNING]", message)
288+
printLogMessage("warning", message)
279289
}
280290

281291
func printLogMessage(level string, message string) {
@@ -288,7 +298,7 @@ func printLogMessage(level string, message string) {
288298
output, _ := json.Marshal(logMsg{Level: level, Message: message})
289299
fmt.Fprintln(feedbackOut, string(output))
290300
default: // Text
291-
fmt.Fprintf(feedbackErr, "%s %s\n", level, message)
301+
fmt.Fprintf(feedbackErr, "%s %s\n", "["+strings.ToUpper(level)+"]", message)
292302
}
293303
}
294304

internal/orchestrator/orchestrator.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ type MessageType string
6666
const (
6767
UnknownType MessageType = ""
6868
ProgressType MessageType = "progress"
69+
MinimalType MessageType = "minimal"
6970
InfoType MessageType = "info"
7071
DebugType MessageType = "debug"
7172
WarningType MessageType = "warning"
@@ -84,6 +85,7 @@ type Progress struct {
8485
Progress float32
8586
}
8687

88+
func (p *StreamMessage) IsMinimal() bool { return p.Type == MinimalType }
8789
func (p *StreamMessage) IsInfo() bool { return p.Type == InfoType }
8890
func (p *StreamMessage) IsDebug() bool { return p.Type == DebugType }
8991
func (p *StreamMessage) IsWarning() bool { return p.Type == WarningType }
@@ -101,7 +103,7 @@ func StartApp(ctx context.Context, docker *dockerClient.Client, provisioner *Pro
101103
ctx, cancel := context.WithCancel(ctx)
102104
defer cancel()
103105

104-
if !yield(StreamMessage{Type: DebugType, data: "Checking for already running apps..."}) {
106+
if !yield(StreamMessage{Type: MinimalType, data: "Checking for already running apps..."}) {
105107
cancel()
106108
return
107109
}
@@ -124,7 +126,7 @@ func StartApp(ctx context.Context, docker *dockerClient.Client, provisioner *Pro
124126
})
125127

126128
if app.MainSketchPath != nil {
127-
if !yield(StreamMessage{Type: InfoType, data: "Compiling and updating sketch..."}) {
129+
if !yield(StreamMessage{Type: MinimalType, data: "Compiling and updating sketch..."}) {
128130
cancel()
129131
return
130132
}
@@ -134,7 +136,7 @@ func StartApp(ctx context.Context, docker *dockerClient.Client, provisioner *Pro
134136
}
135137
}
136138
if app.MainPythonFile != nil {
137-
if !yield(StreamMessage{Type: InfoType, data: "Provisioning app..."}) {
139+
if !yield(StreamMessage{Type: MinimalType, data: "Provisioning app..."}) {
138140
cancel()
139141
return
140142
}
@@ -143,7 +145,7 @@ func StartApp(ctx context.Context, docker *dockerClient.Client, provisioner *Pro
143145
return
144146
}
145147

146-
if !yield(StreamMessage{Type: InfoType, data: "Starting app..."}) {
148+
if !yield(StreamMessage{Type: MinimalType, data: "Starting app..."}) {
147149
cancel()
148150
return
149151
}
@@ -216,7 +218,7 @@ func StopApp(ctx context.Context, app app.ArduinoApp) iter.Seq[StreamMessage] {
216218
}
217219

218220
if app.MainPythonFile != nil {
219-
if !yield(StreamMessage{Type: InfoType, data: "stopping the app..."}) {
221+
if !yield(StreamMessage{Type: MinimalType, data: "stopping the app..."}) {
220222
cancel()
221223
return
222224
}
@@ -244,7 +246,7 @@ func StopApp(ctx context.Context, app app.ArduinoApp) iter.Seq[StreamMessage] {
244246
yield(StreamMessage{Type: ErrorType, error: err})
245247
return
246248
}
247-
} else if !yield(StreamMessage{Type: InfoType, data: "App not running, nothing to stop."}) {
249+
} else if !yield(StreamMessage{Type: MinimalType, data: "App not running, nothing to stop."}) {
248250
return
249251
}
250252
}

0 commit comments

Comments
 (0)