-
Notifications
You must be signed in to change notification settings - Fork 0
/
grinder.go
144 lines (118 loc) · 3.29 KB
/
grinder.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
135
136
137
138
139
140
141
142
143
144
package buna
import (
"context"
"errors"
"fmt"
"os"
"github.com/jedib0t/go-pretty/table"
"golang.org/x/crypto/ssh/terminal"
)
type grinder struct {
name string
company string
maxGrindSetting int
}
func addGrinder(ctx context.Context, db DB) error {
fmt.Println("Adding new coffee grinder (Enter # to quit):")
fmt.Print("Enter grinder name: ")
name, quit := validateStrInput(quitStr, false, nil, nil)
if quit {
fmt.Println(quitMsg)
return nil
}
fmt.Print("Enter grinder's company name: ")
company, quit := validateStrInput(quitStr, true, nil, nil)
if quit {
fmt.Println(quitMsg)
return nil
}
fmt.Print("Enter the maximum grind setting (Integer): ")
maxGrindSetting, quit := validateIntInput(quitStr, true, 0, 100, nil)
if quit {
fmt.Println(quitMsg)
return nil
}
grinder := grinder{
name: name,
company: company,
maxGrindSetting: maxGrindSetting,
}
if err := db.insertGrinder(ctx, grinder); err != nil {
return fmt.Errorf("buna: grinder: failed to insert coffee grinder: %w", err)
}
fmt.Println("Added coffee grinder successfully")
return nil
}
func retrieveGrinder(ctx context.Context, db DB) error {
options := map[int]string{
0: "Retrieve grinders ordered by last added",
}
fmt.Println("Retrieving grinders (Enter # to quit):")
if err := displayIntOptions(options); err != nil {
return fmt.Errorf("buna: grinder: failed to display int options: %w", err)
}
selection, quit, err := getIntSelection(options, quitStr)
if err != nil {
return fmt.Errorf("buna: grinder: failed to get int selection: %w", err)
}
if quit {
fmt.Println(quitMsg)
return nil
}
if err := runRetrieveGrinderSelection(ctx, selection, db); err != nil {
return fmt.Errorf("buna: grinder: failed to run the retrieve selection: %w", err)
}
return nil
}
func runRetrieveGrinderSelection(ctx context.Context, selection int, db DB) error {
switch selection {
case 0:
if err := displayGrindersByLastAdded(ctx, db); err != nil {
return fmt.Errorf("buna: grinder: failed to display grinders by last added: %w", err)
}
default:
return errors.New("buna: grinder: invalid retrieve selection")
}
return nil
}
// Promts user for an optional limit.
func displayGrindersByLastAdded(ctx context.Context, db DB) error {
const defaultDisplayAmount = 20
const maxDisplayAmount = 60
fmt.Println("Displaying grinders by last added (Enter # to quit):")
fmt.Print("Enter a limit for the number of grinders to display: ")
limit, quit := validateIntInput(quitStr, true, 1, maxDisplayAmount, []int{})
if quit {
fmt.Println(quitMsg)
return nil
}
if limit == 0 {
limit = defaultDisplayAmount
}
grinders, err := db.getGrindersByLastAdded(ctx, limit)
if err != nil {
return fmt.Errorf("buna: grinder: failed to get grinders by last added: %w", err)
}
t := table.NewWriter()
t.AppendHeader(table.Row{
"Name",
"Company",
"Max Grind Setting",
})
for _, grinder := range grinders {
t.AppendRow(table.Row{
grinder.name,
grinder.company,
grinder.maxGrindSetting,
})
t.AppendSeparator()
}
terminalWidth, _, err := terminal.GetSize(int(os.Stdin.Fd()))
if err != nil {
return fmt.Errorf("buna: grinder: failed to get terminal width: %w", err)
}
t.SetAllowedRowLength(terminalWidth)
t.SetOutputMirror(os.Stdout)
t.Render()
return nil
}