-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
134 lines (114 loc) · 3.59 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package main
import (
"flag"
"fmt"
"os"
"github.com/hayohtee/expense-tracker/internal/expense"
)
const filename = ".expense_list.json"
func main() {
addCmd := flag.NewFlagSet("add", flag.ExitOnError)
listCmd := flag.NewFlagSet("list", flag.ExitOnError)
summaryCmd := flag.NewFlagSet("summary", flag.ExitOnError)
deleteCmd := flag.NewFlagSet("delete", flag.ExitOnError)
updateCmd := flag.NewFlagSet("update", flag.ExitOnError)
description := addCmd.String("description", "", "The description for the expense")
amount := addCmd.Float64("amount", 0, "The amount for the expense")
newDescription := updateCmd.String("description", "", "The new description for the expense")
newAmount := updateCmd.Float64("amount", 0, "the new amount for the expense")
newID := updateCmd.Int("id", 0, "The ID of the expense to update")
month := summaryCmd.Int("month", 0, "The month to generate the summary for")
id := deleteCmd.Int("id", 0, "The ID of the expense to delete")
if len(os.Args) < 2 {
displayUsage(addCmd, summaryCmd, updateCmd, deleteCmd)
os.Exit(0)
}
// Load the expense list from the file.
var expenseList expense.ExpenseList
if err := expenseList.Load(filename); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
switch os.Args[1] {
case "add":
if err := addCmd.Parse(os.Args[2:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// Add new expense to the list.
if err := expenseList.Add(*description, *amount); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// Write successful message to the STDOUT.
fmt.Printf("Expense added successfully (ID: %d)\n", expenseList[len(expenseList)-1].ID)
// Save the new list.
if err := expenseList.Save(filename); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
case "list":
if err := listCmd.Parse(os.Args[2:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// Write the list of expense to the STDOUT.
expenseList.List(os.Stdout)
case "summary":
if err := summaryCmd.Parse(os.Args[2:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// If month was not specified, simply generate the summary for all expenses
// and write to the STDOUT.
if *month == 0 {
expenseList.Summary(os.Stdout)
return
}
// If month was specified then generate summary for the provided month and
// write to the STDOUT.
if err := expenseList.SummaryForMonth(os.Stdout, *month); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
case "delete":
if err := deleteCmd.Parse(os.Args[2:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// Delete an expense from the list.
if err := expenseList.Delete(*id); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// Write success message to STDOUT.
fmt.Println("Expense deleted successfully")
// Save the new list.
if err := expenseList.Save(filename); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
case "update":
if err := updateCmd.Parse(os.Args[2:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// Update the expense based on the supplied ID, description and amount.
if err := expenseList.Update(*newID, *newDescription, *newAmount); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// Write success message to the STDOUT.
fmt.Printf("Expense updated successfully (ID: %d)\n", *newID)
// Save the new expense list.
if err := expenseList.Save(filename); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
}
func displayUsage(flagSets ...*flag.FlagSet) {
for _, flagSet := range flagSets {
flagSet.Usage()
}
}