Skip to content

Commit

Permalink
feat(text): style certain values
Browse files Browse the repository at this point in the history
  • Loading branch information
aymanbagabas committed Feb 27, 2023
1 parent 395e398 commit 391e751
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 6 deletions.
3 changes: 3 additions & 0 deletions styles.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ var (

// KeyStyles overrides styles for specific keys.
KeyStyles = map[string]lipgloss.Style{}

// ValueStyles overrides value styles for specific keys.
ValueStyles = map[string]lipgloss.Style{}
)

// levelStyle is a helper function to get the style for a level.
Expand Down
19 changes: 14 additions & 5 deletions text.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const (
indentSeparator = " │ "
)

func (l *logger) writeIndent(w io.Writer, str string, indent string, newline bool) {
func (l *logger) writeIndent(w io.Writer, str string, indent string, newline bool, key string) {
// kindly borrowed from hclog
for {
nl := strings.IndexByte(str, '\n')
Expand All @@ -24,7 +24,11 @@ func (l *logger) writeIndent(w io.Writer, str string, indent string, newline boo
_, _ = w.Write([]byte(indent))
val := escapeStringForOutput(str, false)
if !l.noStyles {
val = ValueStyle.Render(val)
if valueStyle, ok := ValueStyles[key]; ok {
val = valueStyle.Render(val)
} else {
val = ValueStyle.Render(val)
}
}
_, _ = w.Write([]byte(val))
if newline {
Expand Down Expand Up @@ -205,6 +209,11 @@ func (l *logger) textFormatter(keyvals ...interface{}) {
if key == "" {
continue
}
actualKey := key
valueStyle := ValueStyle
if vs, ok := ValueStyles[actualKey]; ok {
valueStyle = vs
}
if !l.noStyles {
if keyStyle, ok := KeyStyles[key]; ok {
key = keyStyle.Render(key)
Expand All @@ -224,7 +233,7 @@ func (l *logger) textFormatter(keyvals ...interface{}) {
l.b.WriteString("\n ")
l.b.WriteString(key)
l.b.WriteString(sep + "\n")
l.writeIndent(&l.b, val, indentSep, moreKeys)
l.writeIndent(&l.b, val, indentSep, moreKeys, actualKey)
// If there are more keyvals, separate them with a space.
if moreKeys {
l.b.WriteByte(' ')
Expand All @@ -234,15 +243,15 @@ func (l *logger) textFormatter(keyvals ...interface{}) {
l.b.WriteString(key)
l.b.WriteString(sep)
if !l.noStyles {
l.b.WriteString(ValueStyle.Render(fmt.Sprintf(`"%s"`,
l.b.WriteString(valueStyle.Render(fmt.Sprintf(`"%s"`,
escapeStringForOutput(val, true))))
} else {
l.b.WriteString(fmt.Sprintf(`"%s"`,
escapeStringForOutput(val, true)))
}
} else {
if !l.noStyles {
val = ValueStyle.Render(val)
val = valueStyle.Render(val)
}
l.b.WriteByte(' ')
l.b.WriteString(key)
Expand Down
3 changes: 2 additions & 1 deletion text_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ func TestTextValueStyles(t *testing.T) {
oldValueStyle := ValueStyle
defer func() { ValueStyle = oldValueStyle }()
ValueStyle = lipgloss.NewStyle().Bold(true)
ValueStyles["key3"] = ValueStyle.Copy().Underline(true)
cases := []struct {
name string
expected string
Expand Down Expand Up @@ -302,7 +303,7 @@ func TestTextValueStyles(t *testing.T) {
ErrorLevelStyle,
KeyStyle.Render("key1"), SeparatorStyle.Render(separator), ValueStyle.Render("val1"),
KeyStyle.Render("key2"), SeparatorStyle.Render(separator), ValueStyle.Render("val2"),
KeyStyle.Render("key3"), SeparatorStyle.Render(separator), ValueStyle.Render(`"missing value"`),
KeyStyle.Render("key3"), SeparatorStyle.Render(separator), ValueStyles["key3"].Render(`"missing value"`),
),
msg: "info",
kvs: []interface{}{"key1", "val1", "key2", "val2", "key3"},
Expand Down

0 comments on commit 391e751

Please sign in to comment.