From 1e44adb4706784a8ddef3ffaabdc5178effc4403 Mon Sep 17 00:00:00 2001 From: Ravi Suhag Date: Fri, 3 Sep 2021 05:54:47 -0700 Subject: [PATCH] feat: add term package with color scheme --- go.mod | 1 + go.sum | 11 ++++++ term/color.go | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 term/color.go diff --git a/go.mod b/go.mod index 74a7d30..ad16b7d 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/jeremywohl/flatten v1.0.1 github.com/mcuadros/go-defaults v1.2.0 github.com/mitchellh/mapstructure v1.4.1 + github.com/muesli/termenv v0.9.0 // indirect github.com/olekukonko/tablewriter v0.0.5 github.com/pkg/errors v0.9.1 // indirect github.com/sirupsen/logrus v1.8.1 diff --git a/go.sum b/go.sum index abf2f11..1e79e13 100644 --- a/go.sum +++ b/go.sum @@ -177,12 +177,18 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= +github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mcuadros/go-defaults v1.2.0 h1:FODb8WSf0uGaY8elWJAkoLL0Ri6AlZ1bFlenk56oZtc= github.com/mcuadros/go-defaults v1.2.0/go.mod h1:WEZtHEVIGYVDqkKSWBdWKUVdRyKlMfulPaGDWIVeCWY= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -198,6 +204,8 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/muesli/termenv v0.9.0 h1:wnbOaGz+LUR3jNT0zOzinPnyDaCZUQRZj9GxK8eRVl8= +github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= @@ -213,6 +221,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -386,6 +396,7 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/term/color.go b/term/color.go new file mode 100644 index 0000000..d7c39f4 --- /dev/null +++ b/term/color.go @@ -0,0 +1,99 @@ +package term + +import ( + "fmt" + + "github.com/muesli/termenv" +) + +var tp = termenv.EnvColorProfile() + +type Theme struct { + ColorSuccess termenv.Color + ColorWarn termenv.Color + ColorInfo termenv.Color + ColorError termenv.Color + ColorBody termenv.Color + ColorPrimary termenv.Color + ColorMagenta termenv.Color +} + +var themes = map[string]Theme{ + "light": { + ColorSuccess: tp.Color("#005F00"), + ColorWarn: tp.Color("#FFAF00"), + ColorInfo: tp.Color("#0087FF"), + ColorError: tp.Color("#D70000"), + ColorBody: tp.Color("#303030"), + ColorPrimary: tp.Color("#000087"), + ColorMagenta: tp.Color("#AF00FF"), + }, + "dark": { + ColorSuccess: tp.Color("#A8CC8C"), + ColorWarn: tp.Color("#DBAB79"), + ColorInfo: tp.Color("#66C2CD"), + ColorError: tp.Color("#E88388"), + ColorBody: tp.Color("#B9BFCA"), + ColorPrimary: tp.Color("#71BEF2"), + ColorMagenta: tp.Color("#D290E4"), + }, +} + +type ColorScheme struct { + theme Theme +} + +func NewColorScheme() *ColorScheme { + if !termenv.HasDarkBackground() { + return &ColorScheme{ + theme: themes["light"], + } + } + return &ColorScheme{ + theme: themes["light"], + } +} + +func (c *ColorScheme) Success(t string) string { + return termenv.String(t).Foreground(c.theme.ColorSuccess).String() +} + +func (c *ColorScheme) Successf(t string, args ...interface{}) string { + return c.Success(fmt.Sprintf(t, args...)) +} + +func (c *ColorScheme) Warn(t string) string { + return termenv.String(t).Foreground(c.theme.ColorWarn).String() +} + +func (c *ColorScheme) Warnf(t string, args ...interface{}) string { + return c.Warn(fmt.Sprintf(t, args...)) +} + +func (c *ColorScheme) Info(t string) string { + return termenv.String(t).Foreground(c.theme.ColorInfo).String() +} + +func (c *ColorScheme) Infof(t string, args ...interface{}) string { + return c.Info(fmt.Sprintf(t, args...)) +} + +func (c *ColorScheme) Error(t string) string { + return termenv.String(t).Foreground(c.theme.ColorWarn).String() +} + +func (c *ColorScheme) Errorf(t string, args ...interface{}) string { + return c.Error(fmt.Sprintf(t, args...)) +} + +func (c *ColorScheme) SuccessIcon() string { + return termenv.String("✓").Foreground(c.theme.ColorSuccess).String() +} + +func (c *ColorScheme) WarningIcon() string { + return termenv.String("!").Foreground(c.theme.ColorWarn).String() +} + +func (c *ColorScheme) FailureIcon() string { + return termenv.String("X").Foreground(c.theme.ColorError).String() +}