all repos

viye @ f677b328bfaea6067b0f153c4859b8f639a0d3f1

my shot at reimplementing xiki

viye/internal/plumbing/config/config.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
strip body of ": ", 1 month ago
1
package config
2
3
import (
4
	"fmt"
5
	"strings"
6
7
	"github.com/olexsmir/viye/internal/config"
8
	"github.com/olexsmir/viye/internal/viye"
9
)
10
11
type Tool struct{}
12
13
func (Tool) Name() string               { return "config" }
14
func (Tool) Match(c *viye.Context) bool { return c.Cmd == "config" }
15
func (Tool) Execute(c *viye.Context) (string, error) {
16
	cfg, err := config.Load()
17
	if err != nil {
18
		return "", fmt.Errorf("couldn't load config")
19
	}
20
21
	if len(c.Body) > 0 {
22
		seen := make(map[string]bool, len(c.Body))
23
		for _, line := range c.Body {
24
			key, val, ok := strings.Cut(line, " = ")
25
			if !ok {
26
				continue
27
			}
28
			key, val = strings.TrimSpace(key), strings.TrimSpace(val)
29
			if strings.Contains(key, " ") {
30
				return "", fmt.Errorf("key %q contains spaces", key)
31
			}
32
			seen[key] = true
33
			if err := cfg.Set(key, val); err != nil {
34
				return "", err
35
			}
36
		}
37
		for key := range cfg.GetAll() {
38
			if !seen[key] {
39
				if err := cfg.Delete(key); err != nil {
40
					return "", err
41
				}
42
			}
43
		}
44
	}
45
46
	conf := cfg.GetAll()
47
	maxLen := 0
48
	for key := range conf {
49
		if len(key) > maxLen {
50
			maxLen = len(key)
51
		}
52
	}
53
	var buf strings.Builder
54
	for key, val := range conf {
55
		fmt.Fprintf(&buf, ": %-*s = %s\n", maxLen, key, val)
56
	}
57
58
	buf.WriteByte('\n')
59
	return buf.String(), nil
60
}