Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 33 additions & 4 deletions log/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import (
"fmt"
"math"
"os"
"reflect"
"strings"
"time"

"github.com/charmbracelet/gum/style"
"github.com/charmbracelet/lipgloss"
"github.com/charmbracelet/log"
)
Expand Down Expand Up @@ -68,10 +70,7 @@ func (o Options) Run() error {

st := log.DefaultStyles()
lvl := levelToLog[o.Level]
lvlStyle := o.LevelStyle.ToLipgloss()
if lvlStyle.GetForeground() == lipgloss.Color("") {
lvlStyle = lvlStyle.Foreground(st.Levels[lvl].GetForeground())
}
lvlStyle := o.logToStyle(lvl, st)

st.Levels[lvl] = lvlStyle.
SetString(strings.ToUpper(lvl.String())).
Expand Down Expand Up @@ -147,3 +146,33 @@ var levelToLog = map[string]log.Level{
"error": log.ErrorLevel,
"fatal": log.FatalLevel,
}

func (o Options) logToStyle(level log.Level, defaults *log.Styles) lipgloss.Style {
var levelStyle = style.Styles{}
switch level {
case log.Level(math.MaxInt32):
case log.DebugLevel:
levelStyle = o.LevelDebugStyle
case log.InfoLevel:
levelStyle = o.LevelInfoStyle
case log.WarnLevel:
levelStyle = o.LevelWarnStyle
case log.ErrorLevel:
levelStyle = o.LevelErrorStyle
case log.FatalLevel:
levelStyle = o.LevelFatalStyle
}

// NB: Empirically determined that _this_ is what we get if we pass no CLI/Env args
var defaultLevelStyle = style.Styles{Align: "left", Bold: true, Border: "none", Margin: "0 0", Padding: "0 0"}
if reflect.DeepEqual(levelStyle, defaultLevelStyle) {
Copy link
Author

@reitzig reitzig Sep 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If there's a neater way to check "has the user set any level.$level. option?", I'm all ears :)

Or a style merge, for that matter. 💁‍♂️

levelStyle = o.LevelStyle
}

var lgStyle = levelStyle.ToLipgloss()
if lgStyle.GetForeground() == lipgloss.Color("") {
lgStyle = lgStyle.Foreground(defaults.Levels[level].GetForeground())
}

return lgStyle
}
19 changes: 12 additions & 7 deletions log/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,16 @@ type Options struct {

MinLevel string `help:"Minimal level to show" default:"" env:"GUM_LOG_LEVEL"`

LevelStyle style.Styles `embed:"" prefix:"level." help:"The style of the level being used" set:"defaultBold=true" envprefix:"GUM_LOG_LEVEL_"`
TimeStyle style.Styles `embed:"" prefix:"time." help:"The style of the time" envprefix:"GUM_LOG_TIME_"`
PrefixStyle style.Styles `embed:"" prefix:"prefix." help:"The style of the prefix" set:"defaultBold=true" set:"defaultFaint=true" envprefix:"GUM_LOG_PREFIX_"` //nolint:staticcheck
MessageStyle style.Styles `embed:"" prefix:"message." help:"The style of the message" envprefix:"GUM_LOG_MESSAGE_"`
KeyStyle style.Styles `embed:"" prefix:"key." help:"The style of the key" set:"defaultFaint=true" envprefix:"GUM_LOG_KEY_"`
ValueStyle style.Styles `embed:"" prefix:"value." help:"The style of the value" envprefix:"GUM_LOG_VALUE_"`
SeparatorStyle style.Styles `embed:"" prefix:"separator." help:"The style of the separator" set:"defaultFaint=true" envprefix:"GUM_LOG_SEPARATOR_"`
LevelStyle style.Styles `embed:"" prefix:"level." help:"The style of the level being used" set:"defaultBold=true" envprefix:"GUM_LOG_LEVEL_"`
LevelDebugStyle style.Styles `embed:"" prefix:"level.debug." help:"The style of level 'debug' being used" set:"defaultBold=true" envprefix:"GUM_LOG_LEVEL_DEBUG_"`
LevelInfoStyle style.Styles `embed:"" prefix:"level.info." help:"The style of level 'info' being used" set:"defaultBold=true" envprefix:"GUM_LOG_LEVEL_INFO_"`
LevelWarnStyle style.Styles `embed:"" prefix:"level.warn." help:"The style of level 'warn' being used" set:"defaultBold=true" envprefix:"GUM_LOG_LEVEL_WARN_"`
LevelErrorStyle style.Styles `embed:"" prefix:"level.error." help:"The style of level 'error' being used" set:"defaultBold=true" envprefix:"GUM_LOG_LEVEL_ERROR_"`
LevelFatalStyle style.Styles `embed:"" prefix:"level.fatal." help:"The style of level 'fatal' being used" set:"defaultBold=true" envprefix:"GUM_LOG_LEVEL_FATAL_"`
TimeStyle style.Styles `embed:"" prefix:"time." help:"The style of the time" envprefix:"GUM_LOG_TIME_"`
PrefixStyle style.Styles `embed:"" prefix:"prefix." help:"The style of the prefix" set:"defaultBold=true" set:"defaultFaint=true" envprefix:"GUM_LOG_PREFIX_"` //nolint:staticcheck
MessageStyle style.Styles `embed:"" prefix:"message." help:"The style of the message" envprefix:"GUM_LOG_MESSAGE_"`
KeyStyle style.Styles `embed:"" prefix:"key." help:"The style of the key" set:"defaultFaint=true" envprefix:"GUM_LOG_KEY_"`
ValueStyle style.Styles `embed:"" prefix:"value." help:"The style of the value" envprefix:"GUM_LOG_VALUE_"`
SeparatorStyle style.Styles `embed:"" prefix:"separator." help:"The style of the separator" set:"defaultFaint=true" envprefix:"GUM_LOG_SEPARATOR_"`
}