// Package fonts installs AUR fonts via the yay helper. package fonts import ( "context" "errors" "fmt" "strings" "gitlab.hive-brain.de/MDietermann/Archduino/internal/module" "gitlab.hive-brain.de/MDietermann/Archduino/internal/platform" ) type Module struct { fonts []string pm platform.PackageManager aur platform.AURHelper } func New(fonts []string, pm platform.PackageManager, aur platform.AURHelper) Module { return Module{fonts: fonts, pm: pm, aur: aur} } type state struct{ Missing []string } func (Module) Meta() module.Meta { return module.Meta{ID: "fonts", Name: "Nerd fonts", Description: "Install AUR nerd fonts."} } func (m Module) Detect(ctx context.Context) (module.State, error) { var missing []string for _, f := range m.fonts { ok, err := m.pm.IsInstalled(ctx, f) if err != nil { return nil, err } if !ok { missing = append(missing, f) } } return state{Missing: missing}, nil } func (m Module) Plan(ctx context.Context, cur module.State) (module.Plan, error) { s, _ := cur.(state) if len(s.Missing) == 0 { return module.Plan{}, nil } missing := append([]string{}, s.Missing...) return module.Plan{Actions: []module.Action{ { Description: "ensure yay installed", Kind: module.ActionPackageInstall, Exec: func(ctx context.Context) error { return m.aur.EnsureInstalled(ctx) }, }, { Description: "yay install " + strings.Join(missing, ", "), Kind: module.ActionPackageInstall, Exec: func(ctx context.Context) error { return m.aur.Install(ctx, missing) }, }, }}, nil } func (m Module) Apply(ctx context.Context, p module.Plan, r module.Reporter) error { for i, a := range p.Actions { r.Progress(m.Meta().ID, i+1, len(p.Actions), a.Description) if err := a.Exec(ctx); err != nil { return err } } return nil } func (m Module) Verify(ctx context.Context) error { st, err := m.Detect(ctx) if err != nil { return err } if miss := st.(state).Missing; len(miss) > 0 { return fmt.Errorf("fonts still missing: %v", miss) } return nil } func (m Module) PlanForce(ctx context.Context) (module.Plan, error) { return module.Plan{}, errors.New("PlanForce not implemented") }