package cmd import ( "axolotl/db" "axolotl/models" "axolotl/output" "fmt" "os" "slices" "strings" "github.com/spf13/cobra" ) var ( uTitle, uContent, uDue, dummy string uClearDue bool uAddTags, uRmTags, uAddRels, uRmRels []string ) var updateCmd = &cobra.Command{ Use: "update ", 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 } 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) } return true } if !parseRel(uAddRels, addRels) || !parseRel(uRmRels, rmRels) { return } 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 } if !ok { 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") } 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 } 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) } }, } func init() { rootCmd.AddCommand(updateCmd) 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, "") }