feat(cli): implement removal logic and cli support, handles different expiry duplicates

This commit is contained in:
rsxri 2025-05-16 03:40:44 +01:00
parent 33d0c7d073
commit 4e4904cede
2 changed files with 89 additions and 1 deletions

View file

@ -21,7 +21,7 @@ type Inventory struct {
func (p *Inventory) AddItem(item InventoryItem) {
for i, existing := range p.Items {
if existing.Name == item.Name {
if existing.Name == item.Name && existing.Expiry.Equal(*item.Expiry) {
p.Items[i].Quantity += item.Quantity
fmt.Printf("Updated %s, new quantity: %.2f %s\n", item.Name, p.Items[i].Quantity, item.Unit)
return
@ -31,6 +31,65 @@ func (p *Inventory) AddItem(item InventoryItem) {
fmt.Printf("Added %s, quantity: %.2f %s\n", item.Name, item.Quantity, item.Unit)
}
func (p *Inventory) RemoveItem(name string, quantity float64, expiry *time.Time) {
for i := 0; i < len(p.Items); {
item := p.Items[i]
itemExpiry := "nil"
if item.Expiry != nil {
itemExpiry = item.Expiry.Format("2006-01-02")
}
inputExpiry := "nil"
if expiry != nil {
inputExpiry = expiry.Format("2006-01-02")
}
fmt.Printf("Checking: item.Name=%s | item.Expiry=%s\n", item.Name, itemExpiry)
fmt.Printf("Against: name=%s | expiry=%s\n", name, inputExpiry)
if item.Name != name {
i++
continue
}
if expiry != nil {
if item.Expiry == nil || item.Expiry.Format("2006-01-02") != expiry.Format("2006-01-02") {
i++
continue
}
} else {
var bestIndex = i
for j := i + 1; j < len(p.Items); j++ {
next := p.Items[j]
if next.Name != name {
continue
}
if next.Expiry == nil {
continue
}
if item.Expiry == nil || next.Expiry.Before(*item.Expiry) {
item = next
bestIndex = j
}
}
i = bestIndex
}
if quantity <= 0 || quantity >= item.Quantity {
p.Items = append(p.Items[:i], p.Items[i+1:]...)
fmt.Printf("Removed all of %s (expiry: %s)\n", item.Name, item.Expiry.Format("2006-01-02"))
} else {
p.Items[i].Quantity -= quantity
fmt.Printf("Removed %.2f %s from %s (expiry: %s)\n", quantity, item.Unit, item.Name, item.Expiry.Format("2006-01-02"))
i++
}
return
}
fmt.Printf("Item not found or no matching expiry.\n")
}
func (p *Inventory) ListItems() {
if len(p.Items) == 0 {
fmt.Printf("Pantry is empty\n")

View file

@ -73,6 +73,35 @@ func main() {
return
}
case "remove":
if len(os.Args) < 4 {
fmt.Println("Usage: inventory remove [name] [quantity] [expiry:YYYY-MM-DD]")
return
}
name := os.Args[2]
quantity, err := strconv.ParseFloat(os.Args[3], 64)
if err != nil {
fmt.Println("Invalid quantity")
return
}
var expiry *time.Time
if len(os.Args) >= 5 {
parsed, err := time.Parse("2006-01-02", os.Args[4])
if err != nil {
fmt.Println("Invalid expiry date format. Expected YYYY-MM-DD")
return
}
expiry = &parsed
}
inventory.RemoveItem(name, quantity, expiry)
err = core.SaveInventory(dataFile, inventory)
if err != nil {
fmt.Println("Failed to save inventory:", err)
}
case "list":
inventory.ListItems()