Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 0d867f9

Browse files
authoredSep 10, 2023
Merge pull request #48 from cocoide/develop
Merge develop into main
2 parents dadff00 + 2076c67 commit 0d867f9

14 files changed

+369
-192
lines changed
 

‎cmd/config.go

+17-8
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,24 @@ import (
66

77
"github.com/charmbracelet/bubbles/textinput"
88
tea "github.com/charmbracelet/bubbletea"
9-
"github.com/cocoide/commitify/util"
9+
"github.com/cocoide/commitify/internal/entity"
1010
"github.com/fatih/color"
1111
"github.com/spf13/cobra"
1212
)
1313

1414
var (
15-
configKey = [...]string{"api-key", "language", "format"}
16-
configOption = [][]string{
15+
configKey = [...]string{"api-key", "language", "format", "ai-source"}
16+
configOption = [][]int{
1717
{},
18-
{"Japanese", "English"},
19-
{"Format 1", "Format 2"},
18+
{int(entity.EN), int(entity.JP)},
19+
{int(entity.NormalFormat), int(entity.EmojiFormat), int(entity.PrefixFormat)},
20+
{int(entity.WrapServer), int(entity.OpenAiAPI)},
21+
}
22+
configOptionLabel = [][]string{
23+
{},
24+
{"English", "Japanese"},
25+
{"Normal Format", "Emoji Format", "PrefixFormat"},
26+
{"Wrap Server", "OpenAI API"},
2027
}
2128
)
2229

@@ -147,7 +154,7 @@ func (cm configModel) View() string {
147154
b.WriteString(color.WhiteString("設定内容を選んでください:\n"))
148155
b.WriteString(color.WhiteString(" ↑↓の矢印キーで項目を移動、Enterで選択\n"))
149156

150-
for i, option := range configOption[cm.configKeyIndex] {
157+
for i, option := range configOptionLabel[cm.configKeyIndex] {
151158
if i == cm.configOptionIndex {
152159
b.WriteString(fmt.Sprintf(color.HiCyanString("➡️ %s\n"), option))
153160
} else {
@@ -175,7 +182,7 @@ func init() {
175182
}
176183

177184
func saveConfig(cm configModel) {
178-
currentConfig, err := util.ReadConfig()
185+
currentConfig, err := entity.ReadConfig()
179186
if err != nil {
180187
fmt.Println(err)
181188
}
@@ -187,9 +194,11 @@ func saveConfig(cm configModel) {
187194
currentConfig.UseLanguage = configOption[cm.configKeyIndex][cm.configOptionIndex]
188195
case 2:
189196
currentConfig.CommitFormat = configOption[cm.configKeyIndex][cm.configOptionIndex]
197+
case 3:
198+
currentConfig.AISource = configOption[cm.configKeyIndex][cm.configOptionIndex]
190199
}
191200

192-
err = util.WriteConfig(currentConfig)
201+
err = entity.WriteConfig(currentConfig)
193202
if err != nil {
194203
fmt.Println(err)
195204
}

‎cmd/suggest.go

+59-31
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package cmd
22

33
import (
4-
"context"
54
"fmt"
5+
"log"
6+
"os"
67
"strings"
78

9+
"github.com/charmbracelet/bubbles/textinput"
810
tea "github.com/charmbracelet/bubbletea"
11+
"github.com/cocoide/commitify/internal/entity"
912
"github.com/cocoide/commitify/internal/gateway"
10-
"github.com/cocoide/commitify/internal/service"
1113
"github.com/cocoide/commitify/util"
1214
"github.com/fatih/color"
1315
"github.com/spf13/cobra"
@@ -18,41 +20,47 @@ type model struct {
1820
currentIdx int
1921
errorMsg string
2022
isLoading bool
21-
messages []string
23+
isEditing bool
24+
textInput textinput.Model
2225
}
2326

24-
type generateMessages struct {
25-
messages []string
26-
errorMsg string
27-
}
27+
func (m *model) Init() tea.Cmd {
28+
conf, err := entity.ReadConfig()
29+
if err != nil {
30+
log.Fatal("設定情報の取得に失敗: ", err)
31+
}
2832

29-
func (m model) Init() tea.Cmd {
30-
return func() tea.Msg {
31-
ctx := context.Background()
32-
og := gateway.NewOpenAIGateway(ctx)
33-
ms := service.NewMessageService(og)
34-
stagingCode := util.ExecGetStagingCode()
35-
messages, err := ms.GenerateCommitMessage(stagingCode)
36-
if err != nil {
37-
return generateMessages{errorMsg: "メッセージの生成に失敗: " + err.Error()}
38-
}
39-
return generateMessages{messages: messages}
33+
var gi gateway.GatewayInterface
34+
switch conf.AISource {
35+
case int(entity.WrapServer):
36+
gi = gateway.NewGrpcServeGateway()
37+
default:
38+
gi = gateway.NewGrpcServeGateway()
4039
}
40+
41+
messages, err := gi.FetchCommitMessages()
42+
if err != nil {
43+
log.Fatal("コミットメッセージの生成に失敗: ", err)
44+
os.Exit(-1)
45+
}
46+
m.choices = messages
47+
m.isLoading = false
48+
return textinput.Blink
4149
}
4250

43-
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
51+
func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
52+
var cmd tea.Cmd
53+
m.textInput, cmd = m.textInput.Update(msg)
4454
switch msg := msg.(type) {
45-
case generateMessages:
46-
if msg.errorMsg != "" {
47-
m.errorMsg = msg.errorMsg
48-
m.isLoading = false
49-
return m, nil
50-
}
51-
m.choices = msg.messages
52-
m.isLoading = false
53-
return m, nil
5455
case tea.KeyMsg:
5556
switch msg.Type {
57+
case tea.KeyTab:
58+
m.isEditing = true
59+
m.textInput.Focus()
60+
m.textInput.SetValue(m.choices[m.currentIdx])
61+
m.textInput.CharLimit = 100
62+
m.textInput.Width = 100
63+
return m, cmd
5664
case tea.KeyUp:
5765
if m.currentIdx > 0 {
5866
m.currentIdx--
@@ -74,7 +82,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
7482
return m, nil
7583
}
7684

77-
func (m model) View() string {
85+
func (m *model) View() string {
7886
if m.errorMsg != "" {
7987
return color.RedString(m.errorMsg)
8088
}
@@ -85,9 +93,14 @@ func (m model) View() string {
8593
if m.errorMsg != "" {
8694
b.WriteString(color.RedString(m.errorMsg) + "\n\n")
8795
}
96+
if m.isEditing{
97+
return m.textInput.View()
98+
}
99+
88100
b.WriteString(color.WhiteString("🍕Please select an option:"))
89101
b.WriteString(color.WhiteString("\n Use arrow ↑↓ to navigate and press Enter to select.\n\n"))
90102

103+
91104
for i, choice := range m.choices {
92105
if i == m.currentIdx {
93106
b.WriteString(fmt.Sprintf(color.HiCyanString("➡️ %s\n"), choice))
@@ -98,13 +111,28 @@ func (m model) View() string {
98111
return b.String()
99112
}
100113

114+
func initialModel() model {
115+
ti := textinput.New()
116+
ti.Focus()
117+
118+
return model{
119+
choices :[]string{""},
120+
currentIdx :0,
121+
errorMsg :"",
122+
isLoading: true,
123+
isEditing: false,
124+
textInput: ti,
125+
}
126+
}
127+
128+
101129
var suggestCmd = &cobra.Command{
102130
Use: "suggest",
103131
Short: "Suggestion of commit message for staging repository",
104132
Aliases: []string{"s", "suggest"},
105133
Run: func(cmd *cobra.Command, args []string) {
106-
m := model{isLoading: true}
107-
p := tea.NewProgram(m)
134+
m := initialModel()
135+
p := tea.NewProgram(&m)
108136
p.Run()
109137
},
110138
}

‎go.mod

+8-8
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ require (
1010
github.com/sashabaranov/go-openai v1.15.1
1111
github.com/spf13/cobra v1.7.0
1212
github.com/spf13/viper v1.16.0
13-
google.golang.org/grpc v1.55.0
14-
google.golang.org/protobuf v1.30.0
13+
google.golang.org/grpc v1.58.0
14+
google.golang.org/protobuf v1.31.0
1515
)
1616

1717
require (
@@ -46,10 +46,10 @@ require (
4646
github.com/muesli/reflow v0.3.0 // indirect
4747
github.com/muesli/termenv v0.15.1 // indirect
4848
github.com/rivo/uniseg v0.2.0 // indirect
49-
golang.org/x/net v0.10.0 // indirect
50-
golang.org/x/sync v0.1.0 // indirect
51-
golang.org/x/sys v0.8.0 // indirect
52-
golang.org/x/term v0.8.0 // indirect
53-
golang.org/x/text v0.9.0 // indirect
54-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
49+
golang.org/x/net v0.15.0 // indirect
50+
golang.org/x/sync v0.3.0 // indirect
51+
golang.org/x/sys v0.12.0 // indirect
52+
golang.org/x/term v0.12.0 // indirect
53+
golang.org/x/text v0.13.0 // indirect
54+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
5555
)

‎go.sum

+16-16
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v
299299
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
300300
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
301301
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
302-
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
303-
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
302+
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
303+
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
304304
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
305305
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
306306
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -320,8 +320,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
320320
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
321321
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
322322
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
323-
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
324-
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
323+
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
324+
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
325325
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
326326
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
327327
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -361,11 +361,11 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
361361
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
362362
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
363363
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
364-
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
365-
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
364+
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
365+
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
366366
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
367-
golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
368-
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
367+
golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU=
368+
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
369369
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
370370
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
371371
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -374,8 +374,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
374374
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
375375
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
376376
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
377-
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
378-
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
377+
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
378+
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
379379
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
380380
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
381381
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -492,8 +492,8 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D
492492
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
493493
google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
494494
google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
495-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=
496-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
495+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4=
496+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
497497
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
498498
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
499499
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -510,8 +510,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM
510510
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
511511
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
512512
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
513-
google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag=
514-
google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
513+
google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o=
514+
google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
515515
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
516516
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
517517
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -524,8 +524,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
524524
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
525525
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
526526
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
527-
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
528-
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
527+
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
528+
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
529529
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
530530
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
531531
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
There was a problem loading the remainder of the diff.

0 commit comments

Comments
 (0)