summaryrefslogtreecommitdiff
path: root/widgets/authinfo.go
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/authinfo.go')
-rw-r--r--widgets/authinfo.go93
1 files changed, 93 insertions, 0 deletions
diff --git a/widgets/authinfo.go b/widgets/authinfo.go
new file mode 100644
index 0000000..0879554
--- /dev/null
+++ b/widgets/authinfo.go
@@ -0,0 +1,93 @@
+package widgets
+
+import (
+ "fmt"
+
+ "git.sr.ht/~rjarry/aerc/config"
+ "git.sr.ht/~rjarry/aerc/lib/auth"
+ "git.sr.ht/~rjarry/aerc/lib/ui"
+ "github.com/gdamore/tcell/v2"
+ "github.com/mattn/go-runewidth"
+)
+
+type AuthInfo struct {
+ ui.Invalidatable
+ authdetails *auth.Details
+ showInfo bool
+ uiConfig config.UIConfig
+}
+
+func NewAuthInfo(auth *auth.Details, showInfo bool, uiConfig config.UIConfig) *AuthInfo {
+ return &AuthInfo{authdetails: auth, showInfo: showInfo, uiConfig: uiConfig}
+}
+
+func (a *AuthInfo) Draw(ctx *ui.Context) {
+ defaultStyle := a.uiConfig.GetStyle(config.STYLE_DEFAULT)
+ style := a.uiConfig.GetStyle(config.STYLE_DEFAULT)
+ ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', defaultStyle)
+ var text string
+ if a.authdetails == nil {
+ text = "(no header)"
+ ctx.Printf(0, 0, defaultStyle, text)
+ } else if a.authdetails.Err != nil {
+ style = a.uiConfig.GetStyle(config.STYLE_ERROR)
+ text = a.authdetails.Err.Error()
+ ctx.Printf(0, 0, style, text)
+ } else {
+ checkBounds := func(x int) bool {
+ if x < ctx.Width() {
+ return true
+ } else {
+ return false
+ }
+ }
+ setResult := func(result auth.Result) (string, tcell.Style) {
+ switch result {
+ case auth.ResultNone:
+ return "none", defaultStyle
+ case auth.ResultNeutral:
+ return "neutral", a.uiConfig.GetStyle(config.STYLE_WARNING)
+ case auth.ResultPolicy:
+ return "policy", a.uiConfig.GetStyle(config.STYLE_WARNING)
+ case auth.ResultPass:
+ return "✓", a.uiConfig.GetStyle(config.STYLE_SUCCESS)
+ case auth.ResultFail:
+ return "✗", a.uiConfig.GetStyle(config.STYLE_ERROR)
+ default:
+ return string(result), a.uiConfig.GetStyle(config.STYLE_ERROR)
+ }
+ }
+ x := 1
+ for i := 0; i < len(a.authdetails.Results); i++ {
+ if checkBounds(x) {
+ text, style := setResult(a.authdetails.Results[i])
+ if i > 0 {
+ text = " " + text
+ }
+ x += ctx.Printf(x, 0, style, text)
+ }
+ }
+ if a.showInfo {
+ infoText := ""
+ for i := 0; i < len(a.authdetails.Infos); i++ {
+ if i > 0 {
+ infoText += ","
+ }
+ infoText += a.authdetails.Infos[i]
+ if reason := a.authdetails.Reasons[i]; reason != "" {
+ infoText += reason
+ }
+ }
+ if checkBounds(x) && infoText != "" {
+ if trunc := ctx.Width() - x - 3; trunc > 0 {
+ text = runewidth.Truncate(infoText, trunc, "…")
+ x += ctx.Printf(x, 0, defaultStyle, fmt.Sprintf(" (%s)", text))
+ }
+ }
+ }
+ }
+}
+
+func (a *AuthInfo) Invalidate() {
+ a.DoInvalidate(a)
+}