all repos

viye @ fa602cd19cb3521c7731a187b6e70f3e1c8cdebf

my shot at reimplementing xiki

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
add config, 2 months 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.Path[0] == "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
			line = strings.TrimPrefix(line, ": ")
25
			key, val, ok := strings.Cut(line, " = ")
26
			if !ok {
27
				continue
28
			}
29
			key, val = strings.TrimSpace(key), strings.TrimSpace(val)
30
			if strings.Contains(key, " ") {
31
				return "", fmt.Errorf("key %q contains spaces", key)
32
			}
33
			seen[key] = true
34
			if err := cfg.Set(key, val); err != nil {
35
				return "", err
36
			}
37
		}
38
		for key := range cfg.GetAll() {
39
			if !seen[key] {
40
				if err := cfg.Delete(key); err != nil {
41
					return "", err
42
				}
43
			}
44
		}
45
	}
46
47
	conf := cfg.GetAll()
48
	maxLen := 0
49
	for key := range conf {
50
		if len(key) > maxLen {
51
			maxLen = len(key)
52
		}
53
	}
54
	var buf strings.Builder
55
	for key, val := range conf {
56
		fmt.Fprintf(&buf, ": %-*s = %s\n", maxLen, key, val)
57
	}
58
59
	buf.WriteByte('\n')
60
	return buf.String(), nil
61
}