dict.go

  1package cli
  2
  3import (
  4	"fmt"
  5	"os"
  6	"path/filepath"
  7	"sort"
  8	"strings"
  9
 10	"github.com/floatpane/matcha/spellcheck"
 11)
 12
 13// RunDict dispatches `matcha dict <subcommand>`.
 14func RunDict(args []string) error {
 15	if len(args) == 0 {
 16		return dictUsage()
 17	}
 18	switch args[0] {
 19	case "add":
 20		return RunDictAdd(args[1:])
 21	case "remove", "rm":
 22		return RunDictRemove(args[1:])
 23	case "list", "ls":
 24		return RunDictList()
 25	default:
 26		return dictUsage()
 27	}
 28}
 29
 30func dictUsage() error {
 31	return fmt.Errorf("usage:\n  matcha dict add <language-code>\n  matcha dict remove <language-code>\n  matcha dict list")
 32}
 33
 34// RunDictAdd downloads and installs a spellcheck dictionary.
 35func RunDictAdd(args []string) error {
 36	if len(args) == 0 {
 37		return fmt.Errorf("usage: matcha dict add <language-code>")
 38	}
 39	lang := strings.TrimSpace(args[0])
 40	if lang == "" {
 41		return fmt.Errorf("empty language code")
 42	}
 43	fmt.Printf("Downloading %s dictionary...\n", lang)
 44	path, err := spellcheck.Download(lang)
 45	if err != nil {
 46		return err
 47	}
 48	fmt.Printf("Installed %s -> %s\n", lang, path)
 49	return nil
 50}
 51
 52// RunDictRemove deletes an installed dictionary.
 53func RunDictRemove(args []string) error {
 54	if len(args) == 0 {
 55		return fmt.Errorf("usage: matcha dict remove <language-code>")
 56	}
 57	lang := strings.TrimSpace(args[0])
 58	path, err := spellcheck.DictPath(lang)
 59	if err != nil {
 60		return err
 61	}
 62	if err := os.Remove(path); err != nil {
 63		if os.IsNotExist(err) {
 64			return fmt.Errorf("dictionary not installed: %s", lang)
 65		}
 66		return fmt.Errorf("remove %s: %w", lang, err)
 67	}
 68	fmt.Printf("Removed %s\n", lang)
 69	return nil
 70}
 71
 72// RunDictList prints all installed dictionaries.
 73func RunDictList() error {
 74	dir, err := spellcheck.DictsDir()
 75	if err != nil {
 76		return err
 77	}
 78	entries, err := os.ReadDir(dir)
 79	if err != nil {
 80		return fmt.Errorf("read dicts dir: %w", err)
 81	}
 82	var langs []string
 83	for _, e := range entries {
 84		if e.IsDir() {
 85			continue
 86		}
 87		name := e.Name()
 88		if !strings.HasSuffix(name, ".dic") {
 89			continue
 90		}
 91		langs = append(langs, strings.TrimSuffix(name, ".dic"))
 92	}
 93	sort.Strings(langs)
 94	if len(langs) == 0 {
 95		fmt.Println("No dictionaries installed.")
 96		fmt.Printf("Run `matcha dict add <code>` (e.g. en, en-GB, de, fr).\n")
 97		fmt.Printf("Dictionaries are stored in: %s\n", dir)
 98		return nil
 99	}
100	for _, l := range langs {
101		path := filepath.Join(dir, l+".dic")
102		fmt.Println(l, "  ", path)
103	}
104	return nil
105}