all repos

clerk @ e12aa47

missing tooling for ledger/hledger

clerk/internal/cli/helpers.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
feat: config (#6), 1 month ago
1
package cli
2
3
import (
4
	"fmt"
5
	"io"
6
	"os"
7
	"path/filepath"
8
9
	"github.com/urfave/cli/v3"
10
11
	"olexsmir.xyz/clerk/internal/settings"
12
	"olexsmir.xyz/clerk/journal"
13
)
14
15
func resolvePaths(paths []string) ([]string, error) {
16
	if len(paths) == 0 {
17
		return nil, nil
18
	}
19
20
	seen := make(map[string]bool)
21
22
	var files []string
23
	for _, p := range paths {
24
		info, err := os.Stat(p)
25
		if err != nil {
26
			return nil, fmt.Errorf("%s: %w", p, err)
27
		}
28
29
		if info.IsDir() {
30
			_ = filepath.Walk(p, func(fpath string, finfo os.FileInfo, err error) error {
31
				if err != nil || finfo.IsDir() || !journal.IsJournalFile(fpath) {
32
					return nil
33
				}
34
				if !seen[fpath] {
35
					seen[fpath] = true
36
					files = append(files, fpath)
37
				}
38
				return nil
39
			})
40
			continue
41
		}
42
43
		if journal.IsJournalFile(p) && !seen[p] {
44
			seen[p] = true
45
			files = append(files, p)
46
		}
47
	}
48
49
	return files, nil
50
}
51
52
func readStdin() ([]byte, error) {
53
	src, err := io.ReadAll(os.Stdin)
54
	if err != nil {
55
		return nil, fmt.Errorf("reading stdin: %w", err)
56
	}
57
	return src, nil
58
}
59
60
func findConfigFilePath(cmd *cli.Command) (string, error) {
61
	if p := cmd.String("config"); p != "" {
62
		if _, err := os.Stat(p); err != nil {
63
			return "", fmt.Errorf("config %q: %w", p, err)
64
		}
65
		return p, nil
66
	}
67
68
	cwd, err := os.Getwd()
69
	if err != nil {
70
		return "", err
71
	}
72
	return filepath.Join(cwd, "clerk.toml"), nil
73
}
74
75
func loadConfig(cmd *cli.Command) (settings.Settings, []string, error) {
76
	configPath, err := findConfigFilePath(cmd)
77
	if err != nil {
78
		return settings.Settings{}, nil, err
79
	}
80
	return settings.Load(configPath)
81
}