refactor: replace explicit fields with tag-based property system
This commit is contained in:
@@ -6,45 +6,45 @@ import (
|
||||
"axolotl/output"
|
||||
"fmt"
|
||||
"os"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var updateTitle, updateContent, updateStatus, updatePrio, updateDue string
|
||||
var updateClearDue bool
|
||||
var updateAddTags, updateRemoveTags, updateAddRels, updateRemoveRels []string
|
||||
var (
|
||||
uTitle, uContent, uDue, dummy string
|
||||
uClearDue bool
|
||||
uAddTags, uRmTags, uAddRels, uRmRels []string
|
||||
)
|
||||
|
||||
var updateCmd = &cobra.Command{
|
||||
Use: "update <id>",
|
||||
Short: "Update a node",
|
||||
Args: cobra.ExactArgs(1),
|
||||
Use: "update <id>", Short: "Update a node", Args: cobra.ExactArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
d, err := db.GetDB()
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return
|
||||
}
|
||||
id := args[0]
|
||||
addRels := make(map[models.RelType][]string)
|
||||
removeRels := make(map[models.RelType][]string)
|
||||
for _, r := range updateAddRels {
|
||||
relType, target, err := db.ParseRelFlag(r)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return
|
||||
addRels, rmRels := make(map[models.RelType][]string), make(map[models.RelType][]string)
|
||||
|
||||
parseRel := func(src []string, dst map[models.RelType][]string) bool {
|
||||
for _, r := range src {
|
||||
rt, tgt, err := db.ParseRelFlag(r)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return false
|
||||
}
|
||||
dst[rt] = append(dst[rt], tgt)
|
||||
}
|
||||
addRels[relType] = append(addRels[relType], target)
|
||||
return true
|
||||
}
|
||||
for _, r := range updateRemoveRels {
|
||||
relType, target, err := db.ParseRelFlag(r)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return
|
||||
}
|
||||
removeRels[relType] = append(removeRels[relType], target)
|
||||
if !parseRel(uAddRels, addRels) || !parseRel(uRmRels, rmRels) {
|
||||
return
|
||||
}
|
||||
if updateStatus == "done" {
|
||||
ok, blockers, err := d.CanClose(id)
|
||||
|
||||
if slices.Contains(uAddTags, "_status::done") {
|
||||
ok, blockers, err := d.CanClose(args[0])
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "failed to check blockers:", err)
|
||||
return
|
||||
@@ -53,42 +53,39 @@ var updateCmd = &cobra.Command{
|
||||
fmt.Fprintf(os.Stderr, "cannot close: blocked by %v\n", blockers)
|
||||
return
|
||||
}
|
||||
uRmTags = append(uRmTags, "_status::open")
|
||||
} else if slices.Contains(uAddTags, "_status::open") {
|
||||
uRmTags = append(uRmTags, "_status::done")
|
||||
}
|
||||
err = d.UpdateNode(id, db.UpdateParams{
|
||||
Title: updateTitle,
|
||||
Content: updateContent,
|
||||
DueDate: updateDue,
|
||||
ClearDue: updateClearDue,
|
||||
Status: updateStatus,
|
||||
Priority: updatePrio,
|
||||
AddTags: updateAddTags,
|
||||
RemoveTags: updateRemoveTags,
|
||||
AddRels: addRels,
|
||||
RemoveRels: removeRels,
|
||||
})
|
||||
if err != nil {
|
||||
if slices.ContainsFunc(uAddTags, func(e string) bool { return strings.HasPrefix(e, "_prio") }) {
|
||||
uRmTags = append(uRmTags, "_prio::low", "_prio::medium", "_prio::high")
|
||||
}
|
||||
|
||||
uParams := db.UpdateParams{Title: uTitle, Content: uContent, DueDate: uDue, ClearDue: uClearDue,
|
||||
AddTags: uAddTags, RemoveTags: uRmTags, AddRels: addRels, RemoveRels: rmRels}
|
||||
if err := d.UpdateNode(args[0], uParams); err != nil {
|
||||
fmt.Fprintln(os.Stderr, "failed to update:", err)
|
||||
return
|
||||
}
|
||||
n, err := d.NodeByID(id)
|
||||
if err != nil {
|
||||
if n, err := d.NodeByID(args[0]); err == nil {
|
||||
output.PrintNode(cmd.OutOrStdout(), n, jsonFlag)
|
||||
} else {
|
||||
fmt.Fprintln(os.Stderr, "failed to fetch node:", err)
|
||||
return
|
||||
}
|
||||
output.PrintNode(cmd.OutOrStdout(), n, jsonFlag)
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
rootCmd.AddCommand(updateCmd)
|
||||
updateCmd.Flags().StringVar(&updateTitle, "title", "", "new title")
|
||||
updateCmd.Flags().StringVar(&updateContent, "content", "", "new content")
|
||||
updateCmd.Flags().StringVar(&updateStatus, "status", "", "status (open, done)")
|
||||
updateCmd.Flags().StringVar(&updatePrio, "prio", "", "priority (high, medium, low)")
|
||||
updateCmd.Flags().StringVar(&updateDue, "due", "", "due date")
|
||||
updateCmd.Flags().BoolVar(&updateClearDue, "clear-due", false, "clear due date")
|
||||
updateCmd.Flags().StringArrayVar(&updateAddTags, "tag", nil, "add tags (repeatable)")
|
||||
updateCmd.Flags().StringArrayVar(&updateRemoveTags, "tag-remove", nil, "remove tags (repeatable)")
|
||||
updateCmd.Flags().StringArrayVar(&updateAddRels, "rel", nil, "add relations (type:id, repeatable)")
|
||||
updateCmd.Flags().StringArrayVar(&updateRemoveRels, "rel-remove", nil, "remove relations (type:id, repeatable)")
|
||||
f := updateCmd.Flags()
|
||||
f.StringVar(&uTitle, "title", "", "")
|
||||
f.StringVar(&uContent, "content", "", "")
|
||||
f.StringVar(&uDue, "due", "", "")
|
||||
f.BoolVar(&uClearDue, "clear-due", false, "")
|
||||
f.StringVar(&dummy, "status", "", "")
|
||||
f.StringVar(&dummy, "prio", "", "")
|
||||
f.StringArrayVar(&uAddTags, "tag", nil, "")
|
||||
f.StringArrayVar(&uRmTags, "tag-remove", nil, "")
|
||||
f.StringArrayVar(&uAddRels, "rel", nil, "")
|
||||
f.StringArrayVar(&uRmRels, "rel-remove", nil, "")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user