all repos

clerk @ olex/oxrnnk

missing tooling for ledger/hledger

clerk/tags.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
generate tags, 2 days ago
1
package main
2
3
import (
4
	"flag"
5
	"fmt"
6
	"os"
7
	"path/filepath"
8
9
	"olexsmir.xyz/clerk/journal"
10
	"olexsmir.xyz/clerk/journal/tags"
11
)
12
13
func runTags(args []string) {
14
	fs := flag.NewFlagSet("tags", flag.ExitOnError)
15
	output := fs.String("o", "tags", "output file, set to - for stdout")
16
	fs.Usage = func() {
17
		fmt.Fprintf(os.Stderr, "Usage: clerk tags [-o tags] [<journals>...]\n")
18
		fs.PrintDefaults()
19
	}
20
	fs.Parse(args)
21
22
	cwd, err := os.Getwd()
23
	if err != nil {
24
		fmt.Fprintf(os.Stderr, "error getting working directory: %v\n", err)
25
		os.Exit(1)
26
	}
27
28
	rawPaths := fs.Args()
29
	if len(rawPaths) == 0 {
30
		rawPaths = []string{"."}
31
	}
32
33
	var journals []string
34
	seen := make(map[string]bool)
35
	for _, p := range rawPaths {
36
		info, err := os.Stat(p)
37
		if err != nil {
38
			fmt.Fprintf(os.Stderr, "error reading %s: %v\n", p, err)
39
			os.Exit(1)
40
		}
41
42
		if info.IsDir() {
43
			entries, err := os.ReadDir(p)
44
			if err != nil {
45
				fmt.Fprintf(os.Stderr, "error reading directory %s: %v\n", p, err)
46
				os.Exit(1)
47
			}
48
			for _, entry := range entries {
49
				if entry.IsDir() { // TODO: keep traversing?
50
					continue
51
				}
52
				fpath := filepath.Join(p, entry.Name())
53
				if journal.IsJournalFile(fpath) && !seen[fpath] {
54
					seen[fpath] = true
55
					journals = append(journals, fpath)
56
				}
57
			}
58
		} else if journal.IsJournalFile(p) && !seen[p] {
59
			seen[p] = true
60
			journals = append(journals, p)
61
		}
62
	}
63
64
	if len(journals) == 0 {
65
		fmt.Fprintf(os.Stderr, "no journal files found\n")
66
		os.Exit(1)
67
	}
68
69
	loader := journal.NewLoader()
70
	for _, path := range journals {
71
		if _, err := loader.Load(path); err != nil {
72
			fmt.Fprintf(os.Stderr, "error loading %s: %v\n", path, err)
73
			os.Exit(1)
74
		}
75
	}
76
77
	tagger := tags.New(loader, cwd)
78
79
	w := os.Stdout
80
	if *output != "-" {
81
		f, err := os.Create(*output)
82
		if err != nil {
83
			fmt.Fprintf(os.Stderr, "error creating output file: %v\n", err)
84
			os.Exit(1)
85
		}
86
		defer f.Close()
87
		w = f
88
	}
89
90
	if err := tagger.Write(w); err != nil {
91
		fmt.Fprintf(os.Stderr, "error writing tags: %v\n", err)
92
		os.Exit(1)
93
	}
94
}