@@ -10,122 +10,102 @@ import (
10
10
"github.com/charmbracelet/bubbles/textinput"
11
11
tea "github.com/charmbracelet/bubbletea"
12
12
"github.com/charmbracelet/lipgloss"
13
- "github.com/cocoide/commitify/internal/entity"
14
- "github.com/cocoide/commitify/internal/gateway"
15
- "github.com/cocoide/commitify/util"
16
13
"github.com/fatih/color"
17
14
"github.com/spf13/cobra"
15
+
16
+ "github.com/cocoide/commitify/internal/service"
18
17
)
19
18
20
19
var (
21
20
textStyle = lipgloss .NewStyle ().Foreground (lipgloss .Color ("252" )).Render
22
21
spinnerStyle = lipgloss .NewStyle ().Foreground (lipgloss .Color ("69" ))
23
- helpStyle = lipgloss .NewStyle ().Foreground (lipgloss .Color ("241" )).Render
24
22
)
25
23
26
- type model struct {
24
+ type suggestModel struct {
27
25
choices []string
28
26
currentIdx int
29
27
errorMsg string
30
28
isLoading bool
31
29
isEditing bool
32
30
spinner spinner.Model
33
31
textInput textinput.Model
32
+ scs * service.SuggestCmdService
34
33
}
35
34
36
- func (m * model ) Init () tea.Cmd {
37
- conf , err := entity .ReadConfig ()
38
- if err != nil {
39
- log .Fatal ("設定情報の取得に失敗: " , err )
40
- }
41
-
42
- var gi gateway.GatewayInterface
43
- switch conf .AISource {
44
- case int (entity .WrapServer ):
45
- gi = gateway .NewGrpcServeGateway ()
46
- default :
47
- gi = gateway .NewGrpcServeGateway ()
48
- }
49
-
35
+ func (sm * suggestModel ) Init () tea.Cmd {
50
36
go func () {
51
- messages , err := gi . FetchCommitMessages ()
37
+ messages , err := sm . scs . GenerateCommitMessages ()
52
38
if err != nil {
53
39
log .Fatal ("コミットメッセージの生成に失敗: " , err )
54
40
os .Exit (- 1 )
55
41
}
56
- m .choices = messages
57
- m .isLoading = false
42
+ sm .choices = messages
43
+ sm .isLoading = false
58
44
}()
59
45
60
46
return textinput .Blink
61
47
}
62
48
63
- func (m * model ) Update (msg tea.Msg ) (tea.Model , tea.Cmd ) {
49
+ func (sm * suggestModel ) Update (msg tea.Msg ) (tea.Model , tea.Cmd ) {
64
50
var cmd tea.Cmd
65
- m .textInput , cmd = m .textInput .Update (msg )
51
+ sm .textInput , cmd = sm .textInput .Update (msg )
66
52
switch msg := msg .(type ) {
67
53
case tea.KeyMsg :
68
54
switch msg .Type {
69
55
case tea .KeyTab :
70
- m .isEditing = true
71
- m .textInput .Focus ()
72
- m .textInput .SetValue (m .choices [m .currentIdx ])
73
- m .textInput .CharLimit = 100
74
- m .textInput .Width = 100
75
- return m , cmd
56
+ sm .isEditing = true
57
+ sm .textInput .Focus ()
58
+ sm .textInput .SetValue (sm .choices [sm .currentIdx ])
59
+ sm .textInput .CharLimit = 100
60
+ sm .textInput .Width = 100
61
+ return sm , cmd
76
62
case tea .KeyUp :
77
- if m .currentIdx > 0 {
78
- m .currentIdx --
63
+ if sm .currentIdx > 0 {
64
+ sm .currentIdx --
79
65
}
80
66
case tea .KeyDown :
81
- if m .currentIdx < len (m .choices )- 1 {
82
- m .currentIdx ++
67
+ if sm .currentIdx < len (sm .choices )- 1 {
68
+ sm .currentIdx ++
83
69
}
84
70
case tea .KeyEnter :
85
- if err := util . ExecCommitMessage ( m .choices [m .currentIdx ]); err != nil {
86
- m .errorMsg = "コミットに失敗: " + err .Error ()
87
- return m , tea .Quit
71
+ if err := sm . scs . SubmitCommit ( sm .choices [sm .currentIdx ]); err != nil {
72
+ sm .errorMsg = "コミットに失敗: " + err .Error ()
73
+ return sm , tea .Quit
88
74
}
89
- return m , tea .Quit
75
+ return sm , tea .Quit
90
76
case tea .KeyCtrlC , tea .KeyEsc :
91
- return m , tea .Quit
77
+ return sm , tea .Quit
92
78
}
93
79
case spinner.TickMsg :
94
80
var cmd tea.Cmd
95
- m .spinner , cmd = m .spinner .Update (msg )
96
- return m , cmd
81
+ sm .spinner , cmd = sm .spinner .Update (msg )
82
+ return sm , cmd
97
83
}
98
- return m , m .spinner .Tick
84
+ return sm , sm .spinner .Tick
99
85
}
100
86
101
- func (m * model ) resetSpinner () {
102
- m .spinner = spinner .New ()
103
- m .spinner .Style = spinnerStyle
104
- m .spinner .Spinner = spinner .Globe
105
- }
106
-
107
- func (m * model ) View () string {
108
- if m .errorMsg != "" {
109
- return color .RedString (m .errorMsg )
87
+ func (sm * suggestModel ) View () string {
88
+ if sm .errorMsg != "" {
89
+ return color .RedString (sm .errorMsg )
110
90
}
111
- if m .isLoading {
112
- s := fmt .Sprintf ("\n %s %s\n \n " , m .spinner .View (), textStyle ("コミットメッセージ生成中" ))
91
+ if sm .isLoading {
92
+ s := fmt .Sprintf ("\n %s %s\n \n " , sm .spinner .View (), textStyle ("コミットメッセージ生成中" ))
113
93
return s
114
94
}
115
95
var b strings.Builder
116
- if m .errorMsg != "" {
117
- b .WriteString (color .RedString (m .errorMsg ) + "\n \n " )
96
+ if sm .errorMsg != "" {
97
+ b .WriteString (color .RedString (sm .errorMsg ) + "\n \n " )
118
98
}
119
- if m .isEditing {
120
- return m .textInput .View ()
99
+ if sm .isEditing {
100
+ return sm .textInput .View ()
121
101
}
122
102
123
103
b .WriteString (color .WhiteString ("🍕 Please select and enter to commit" ))
124
104
b .WriteString (color .WhiteString ("\n Use arrow ↑↓ to navigate and press Enter to select." ))
125
105
b .WriteString (color .WhiteString ("\n ( enter Tab key to edit message )\n \n " ))
126
106
127
- for i , choice := range m .choices {
128
- if i == m .currentIdx {
107
+ for i , choice := range sm .choices {
108
+ if i == sm .currentIdx {
129
109
b .WriteString (fmt .Sprintf (color .HiCyanString ("➡️ %s\n " ), choice ))
130
110
} else {
131
111
b .WriteString (fmt .Sprintf (color .CyanString (" %s\n " ), choice ))
@@ -134,28 +114,44 @@ func (m *model) View() string {
134
114
return b .String ()
135
115
}
136
116
137
- func initialModel () model {
117
+ // モデルの初期化処理
118
+ func NewSuggestModel () * suggestModel {
138
119
ti := textinput .New ()
139
120
ti .Focus ()
140
121
141
- return model {
122
+ // suggestコマンドのサービスの取得
123
+ scs , err := service .NewSuggestCmdService ()
124
+ if err != nil {
125
+ log .Fatal (err )
126
+ os .Exit (- 1 )
127
+ }
128
+
129
+ return & suggestModel {
142
130
choices : []string {"" },
143
131
currentIdx : 0 ,
144
132
errorMsg : "" ,
145
133
isLoading : true ,
146
134
isEditing : false ,
147
135
textInput : ti ,
136
+ scs : scs ,
148
137
}
149
138
}
150
139
140
+ // スピナーの初期化
141
+ func (sm * suggestModel ) initSpinner () {
142
+ sm .spinner = spinner .New ()
143
+ sm .spinner .Style = spinnerStyle
144
+ sm .spinner .Spinner = spinner .Globe
145
+ }
146
+
151
147
var suggestCmd = & cobra.Command {
152
148
Use : "suggest" ,
153
149
Short : "Suggestion of commit message for staging repository" ,
154
150
Aliases : []string {"s" , "suggest" },
155
151
Run : func (cmd * cobra.Command , args []string ) {
156
- m := initialModel ()
157
- m . resetSpinner ()
158
- p := tea .NewProgram (& m )
152
+ sm := NewSuggestModel ()
153
+ sm . initSpinner ()
154
+ p := tea .NewProgram (sm )
159
155
p .Run ()
160
156
},
161
157
}
0 commit comments