...
1 package cmd
2
3 import (
4 "context"
5 "fmt"
6 "path/filepath"
7 "slices"
8 "time"
9
10 "edge-infra.dev/pkg/lib/cli/rags"
11 "edge-infra.dev/pkg/lib/cli/sink"
12 "edge-infra.dev/pkg/tools/dlog"
13 )
14
15 func newEditCmd() *sink.Command {
16 var (
17 dir, template, status string
18 addTags, removeTags []string
19 )
20
21 cmd := &sink.Command{
22 Use: "edit [flags] <file>",
23 Short: "Edit decision logs.",
24 Flags: []*rags.Rag{
25 dirFlag(&dir),
26 templateFlag(&template),
27 {
28 Name: "add-tags",
29 Value: &rags.StringSet{Var: &addTags},
30 Usage: "Comma separated list of tags to apply to dlog. Can be provided multiple times.",
31 },
32 {
33 Name: "remove-tags",
34 Value: &rags.StringSet{Var: &removeTags},
35 Usage: "Comma separated list of tags to remove from dlog. Can be provided multiple times.",
36 },
37 {
38 Name: "status",
39 Value: &rags.String{Var: &status},
40 Usage: "New dlog status",
41 },
42 },
43 Exec: func(_ context.Context, r sink.Run) error {
44 if len(r.Args()) != 1 {
45 return fmt.Errorf("a name for the decision log file is required")
46 }
47
48 if len(addTags) == 0 && status == "" && len(removeTags) == 0 {
49 return fmt.Errorf("at least one edit is required")
50 }
51
52 p := filepath.Join(dir, r.Args()[0])
53 d, err := dlog.FromMarkdown(p)
54 if err != nil {
55 return err
56 }
57
58 if len(removeTags) > 0 {
59 n := 0
60 for _, t := range d.Tags {
61 if !slices.Contains(removeTags, t) {
62 d.Tags[n] = t
63 n++
64 }
65 }
66 d.Tags = d.Tags[:n]
67 }
68
69 if len(addTags) > 0 {
70 d.Tags = append(d.Tags, addTags...)
71 slices.Sort(d.Tags)
72 d.Tags = slices.Compact(d.Tags)
73 }
74
75 if status != "" {
76 d.Status = status
77 }
78
79
80 d.Date.Time = time.Now()
81
82 return dlog.ToMarkdown(d, dir)
83 },
84 }
85
86 return cmd
87 }
88
View as plain text