aboutsummaryrefslogblamecommitdiffstats
path: root/widgets/authinfo.go
blob: 08795541c4251c3dc4a655d94c0b4e82cfd78820 (plain) (tree)




























































































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