Skip to content

Commit 7edea86

Browse files
committed
refactor: separate file for ui
1 parent 7ff8b0a commit 7edea86

File tree

2 files changed

+96
-83
lines changed

2 files changed

+96
-83
lines changed

Diff for: main.go

+5-83
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
package main
22

33
import (
4-
"fmt"
5-
"io"
4+
"context"
65
"os"
7-
8-
"github.com/eiannone/keyboard"
9-
"github.com/gosuri/uilive"
106
)
117

128
func main() {
@@ -16,87 +12,13 @@ func main() {
1612
}
1713

1814
func run(args []string) error {
19-
// Init state
15+
// Get branches
2016
view := &branchesState{}
2117
if err := view.init(args); err != nil {
2218
return err
2319
}
2420

25-
// Setup key input
26-
keyCh, err := keyboard.GetKeys(10)
27-
if err != nil {
28-
return err
29-
}
30-
defer keyboard.Close()
31-
32-
// Setup writer and start with currently selected branch
33-
stdout := uilive.New()
34-
fmt.Fprintf(stdout, "→ %s\n", view.selectedBranchWithColor())
35-
stdout.Flush()
36-
37-
// Listen for keyboard events and term signal
38-
for {
39-
select {
40-
case ev := <-keyCh:
41-
done, err := handleKeyEvent(stdout, view, ev)
42-
if !done {
43-
continue
44-
}
45-
return err
46-
}
47-
}
48-
}
49-
50-
func handleKeyEvent(wf writerFlusher, view *branchesState, ev keyboard.KeyEvent) (bool, error) {
51-
if ev.Err != nil {
52-
return true, ev.Err
53-
}
54-
switch {
55-
// Exit
56-
case ev.Key == keyboard.KeyCtrlC:
57-
fallthrough
58-
case ev.Key == keyboard.KeyEsc:
59-
return true, nil
60-
61-
// Up
62-
case ev.Key == keyboard.KeyArrowUp:
63-
fallthrough
64-
case ev.Key == keyboard.KeyArrowLeft:
65-
fallthrough
66-
case ev.Rune == 'h':
67-
view.selectPrevious()
68-
fmt.Fprintf(wf, "→ %s\n", view.selectedBranchWithColor())
69-
wf.Flush()
70-
71-
// Down
72-
case ev.Key == keyboard.KeyArrowDown:
73-
fallthrough
74-
case ev.Key == keyboard.KeyArrowRight:
75-
fallthrough
76-
case ev.Rune == 'j':
77-
view.selectNext()
78-
fmt.Fprintf(wf, "→ %s\n", view.selectedBranchWithColor())
79-
wf.Flush()
80-
81-
// Enter
82-
case ev.Key == keyboard.KeyEnter:
83-
return true, cmdRun("git", "checkout", extractBranch(view.selectedBranchName()))
84-
85-
default:
86-
return false, nil
87-
}
88-
return false, nil
89-
}
90-
91-
type writerWrapper struct {
92-
io.Writer
93-
}
94-
95-
func (w *writerWrapper) Flush() error {
96-
return nil
97-
}
98-
99-
type writerFlusher interface {
100-
io.Writer
101-
Flush() error
21+
// Run ui
22+
ui := newUI(view)
23+
return ui.run(context.Background())
10224
}

Diff for: ui.go

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
8+
"github.com/eiannone/keyboard"
9+
"github.com/gosuri/uilive"
10+
)
11+
12+
type ui struct {
13+
wf writerFlusher
14+
view *branchesState
15+
}
16+
17+
func newUI(view *branchesState) ui {
18+
return ui{
19+
wf: uilive.New(),
20+
view: view,
21+
}
22+
}
23+
24+
func (ui *ui) run(ctx context.Context) error {
25+
// Setup key input
26+
keyCh, err := keyboard.GetKeys(10)
27+
if err != nil {
28+
return err
29+
}
30+
defer keyboard.Close()
31+
32+
// Listen for keyboard events
33+
for {
34+
select {
35+
case ev := <-keyCh:
36+
done, err := ui.handleKeyEvent(ev)
37+
if !done {
38+
continue
39+
}
40+
return err
41+
case <-ctx.Done():
42+
return nil
43+
}
44+
}
45+
}
46+
47+
func (ui *ui) handleKeyEvent(ev keyboard.KeyEvent) (bool, error) {
48+
if ev.Err != nil {
49+
return true, ev.Err
50+
}
51+
switch {
52+
// Exit
53+
case ev.Key == keyboard.KeyCtrlC:
54+
fallthrough
55+
case ev.Key == keyboard.KeyEsc:
56+
return true, nil
57+
58+
// Up
59+
case ev.Key == keyboard.KeyArrowUp:
60+
fallthrough
61+
case ev.Key == keyboard.KeyArrowLeft:
62+
fallthrough
63+
case ev.Rune == 'h':
64+
ui.view.selectPrevious()
65+
fmt.Fprintf(ui.wf, "→ %s\n", ui.view.selectedBranchWithColor())
66+
ui.wf.Flush()
67+
68+
// Down
69+
case ev.Key == keyboard.KeyArrowDown:
70+
fallthrough
71+
case ev.Key == keyboard.KeyArrowRight:
72+
fallthrough
73+
case ev.Rune == 'j':
74+
ui.view.selectNext()
75+
fmt.Fprintf(ui.wf, "→ %s\n", ui.view.selectedBranchWithColor())
76+
ui.wf.Flush()
77+
78+
// Enter
79+
case ev.Key == keyboard.KeyEnter:
80+
return true, cmdRun("git", "checkout", extractBranch(ui.view.selectedBranchName()))
81+
82+
default:
83+
return false, nil
84+
}
85+
return false, nil
86+
}
87+
88+
type writerFlusher interface {
89+
io.Writer
90+
Flush() error
91+
}

0 commit comments

Comments
 (0)