package ui import ( "log" tb "github.com/nsf/termbox-go" "git.sr.ht/~sircmpwn/aerc2/config" "git.sr.ht/~sircmpwn/aerc2/worker" "git.sr.ht/~sircmpwn/aerc2/worker/types" ) type AccountTab struct { Config *config.AccountConfig Worker *types.Worker Parent *UIState logger *log.Logger counter int } func NewAccountTab(conf *config.AccountConfig, logger *log.Logger) (*AccountTab, error) { work, err := worker.NewWorker(conf.Source, logger) if err != nil { return nil, err } go work.Backend.Run() acc := &AccountTab{ Config: conf, Worker: work, logger: logger, } acc.Worker.PostAction(&types.Configure{Config: conf}, nil) acc.Worker.PostAction(&types.Connect{}, func(msg types.WorkerMessage) { switch msg := msg.(type) { case *types.Done: acc.logger.Println("Connected.") acc.Worker.PostAction(&types.ListDirectories{}, nil) case *types.CertificateApprovalRequest: // TODO: Ask the user acc.logger.Println("Approving certificate") acc.Worker.PostAction(&types.ApproveCertificate{ Message: types.RespondTo(msg), Approved: true, }, nil) default: acc.logger.Println("Connection failed.") } }) return acc, nil } func (acc *AccountTab) Name() string { return acc.Config.Name } func (acc *AccountTab) SetParent(parent *UIState) { acc.Parent = parent } func (acc *AccountTab) Render(at Geometry) { cell := tb.Cell{ Ch: ' ', Fg: tb.ColorDefault, Bg: tb.ColorDefault, } TFill(at, cell) TPrintf(&at, cell, "%s %d\n", acc.Name(), acc.counter) acc.counter++ if acc.counter%10000 == 0 { acc.counter = 0 } acc.Parent.InvalidateFrom(acc) } func (acc *AccountTab) GetChannel() chan types.WorkerMessage { return acc.Worker.Messages } func (acc *AccountTab) HandleMessage(msg types.WorkerMessage) { msg = acc.Worker.ProcessMessage(msg) switch msg := msg.(type) { case *types.Done: case *types.CertificateApprovalRequest: case *types.Unsupported: // no-op case *types.Error: acc.logger.Printf("Error: %v\n", msg.Error) case *types.Directory: acc.logger.Printf("Directory: %s\n", msg.Name) default: acc.Worker.PostAction(&types.Unsupported{ Message: types.RespondTo(msg), }, nil) } }