File: theme.go

package info (click to toggle)
golang-github-phsym-console-slog 0.3.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 188 kB
  • sloc: makefile: 3
file content (151 lines) | stat: -rw-r--r-- 3,334 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package console

import (
	"fmt"
	"log/slog"
)

type ANSIMod string

var ResetMod = ToANSICode(Reset)

const (
	Reset = iota
	Bold
	Faint
	Italic
	Underline
	CrossedOut = 9
)

const (
	Black = iota + 30
	Red
	Green
	Yellow
	Blue
	Magenta
	Cyan
	Gray
)

const (
	BrightBlack = iota + 90
	BrightRed
	BrightGreen
	BrightYellow
	BrightBlue
	BrightMagenta
	BrightCyan
	White
)

func (c ANSIMod) String() string {
	return string(c)
}

func ToANSICode(modes ...int) ANSIMod {
	if len(modes) == 0 {
		return ""
	}

	var s string
	for i, m := range modes {
		if i > 0 {
			s += ";"
		}
		s += fmt.Sprintf("%d", m)
	}
	return ANSIMod("\x1b[" + s + "m")
}

type Theme interface {
	Name() string
	Timestamp() ANSIMod
	Source() ANSIMod

	Message() ANSIMod
	MessageDebug() ANSIMod
	AttrKey() ANSIMod
	AttrValue() ANSIMod
	AttrValueError() ANSIMod
	LevelError() ANSIMod
	LevelWarn() ANSIMod
	LevelInfo() ANSIMod
	LevelDebug() ANSIMod
	Level(level slog.Level) ANSIMod
}

type ThemeDef struct {
	name           string
	timestamp      ANSIMod
	source         ANSIMod
	message        ANSIMod
	messageDebug   ANSIMod
	attrKey        ANSIMod
	attrValue      ANSIMod
	attrValueError ANSIMod
	levelError     ANSIMod
	levelWarn      ANSIMod
	levelInfo      ANSIMod
	levelDebug     ANSIMod
}

func (t ThemeDef) Name() string            { return t.name }
func (t ThemeDef) Timestamp() ANSIMod      { return t.timestamp }
func (t ThemeDef) Source() ANSIMod         { return t.source }
func (t ThemeDef) Message() ANSIMod        { return t.message }
func (t ThemeDef) MessageDebug() ANSIMod   { return t.messageDebug }
func (t ThemeDef) AttrKey() ANSIMod        { return t.attrKey }
func (t ThemeDef) AttrValue() ANSIMod      { return t.attrValue }
func (t ThemeDef) AttrValueError() ANSIMod { return t.attrValueError }
func (t ThemeDef) LevelError() ANSIMod     { return t.levelError }
func (t ThemeDef) LevelWarn() ANSIMod      { return t.levelWarn }
func (t ThemeDef) LevelInfo() ANSIMod      { return t.levelInfo }
func (t ThemeDef) LevelDebug() ANSIMod     { return t.levelDebug }
func (t ThemeDef) Level(level slog.Level) ANSIMod {
	switch {
	case level >= slog.LevelError:
		return t.LevelError()
	case level >= slog.LevelWarn:
		return t.LevelWarn()
	case level >= slog.LevelInfo:
		return t.LevelInfo()
	default:
		return t.LevelDebug()
	}
}

func NewDefaultTheme() Theme {
	return ThemeDef{
		name:           "Default",
		timestamp:      ToANSICode(BrightBlack),
		source:         ToANSICode(Bold, BrightBlack),
		message:        ToANSICode(Bold),
		messageDebug:   ToANSICode(),
		attrKey:        ToANSICode(Cyan),
		attrValue:      ToANSICode(),
		attrValueError: ToANSICode(Bold, Red),
		levelError:     ToANSICode(Red),
		levelWarn:      ToANSICode(Yellow),
		levelInfo:      ToANSICode(Green),
		levelDebug:     ToANSICode(),
	}
}

func NewBrightTheme() Theme {
	return ThemeDef{
		name:           "Bright",
		timestamp:      ToANSICode(Gray),
		source:         ToANSICode(Bold, Gray),
		message:        ToANSICode(Bold, White),
		messageDebug:   ToANSICode(),
		attrKey:        ToANSICode(BrightCyan),
		attrValue:      ToANSICode(),
		attrValueError: ToANSICode(Bold, BrightRed),
		levelError:     ToANSICode(BrightRed),
		levelWarn:      ToANSICode(BrightYellow),
		levelInfo:      ToANSICode(BrightGreen),
		levelDebug:     ToANSICode(),
	}
}