Files
dqs/internal/dqs/command/remove.go
T
2026-10-26 15:14:43 +00:00

76 lines
1.5 KiB
Go

package command
import (
"errors"
"fmt"
"os"
"time"
"code.chimeric.al/dwrz/dqs/internal/dqs/command/help"
"code.chimeric.al/dwrz/dqs/internal/dqs/entry"
"code.chimeric.al/dwrz/dqs/internal/dqs/portion"
"code.chimeric.al/dwrz/dqs/internal/dqs/store"
)
var Remove = &command{
execute: removePortions,
description: "remove portions from an entry",
help: help.Remove,
name: "remove",
}
func removePortions(args []string, date time.Time, store *store.Store) error {
u, err := store.GetUser()
if err != nil && !errors.Is(err, os.ErrNotExist) {
return fmt.Errorf("failed to get user: %w", err)
}
if u == nil {
return Config.execute(args, date, store)
}
e, err := store.GetEntry(date.Format(entry.DateFormat))
if err != nil && !errors.Is(err, os.ErrNotExist) {
return fmt.Errorf("failed to get entry: %w", err)
}
if e == nil {
e = entry.New(date, u)
}
if len(args) < 2 {
return fmt.Errorf("missing category and quantity")
}
if len(args)%2 != 0 {
return fmt.Errorf("uneven number of arguments")
}
for i := 0; i < len(args); i += 2 {
portionCategory := args[i]
quantity := args[i+1]
c, err := e.Category(portionCategory)
if err != nil {
return err
}
q, err := portion.Parse(quantity)
if err != nil {
return err
}
if err := c.Remove(q); err != nil {
return fmt.Errorf(
"failed to remove portions: %w", err,
)
}
}
if err := store.UpdateEntry(e); err != nil {
return fmt.Errorf("failed to store entry: %w", err)
}
fmt.Println(e.FormatPrint(u))
return nil
}