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(),
}
}
|