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}