Skip to content

Commit a7bf088

Browse files
committed
feat: extract complexity
1 parent 66227eb commit a7bf088

File tree

1 file changed

+184
-168
lines changed

1 file changed

+184
-168
lines changed

pkg/cmd/config/init/init.go

+184-168
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,27 @@ import (
1212
"golang.org/x/text/language"
1313
)
1414

15+
func queue(
16+
tasks ...func() error,
17+
) error {
18+
for _, t := range tasks {
19+
if err := t(); err != nil {
20+
return err
21+
}
22+
}
23+
24+
return nil
25+
}
26+
27+
// NewCmdInit executes and initialization of the config
1528
func NewCmdInit(f cmdutil.Factory) *cobra.Command {
1629
cmd := &cobra.Command{
1730
Use: "init",
1831
Short: "Setups the CLI parameters and behavior",
1932
Long: "Setups the CLI parameters with tokens, default workspace, " +
2033
"user and behaviors",
2134
Args: cobra.ExactArgs(0),
22-
RunE: func(cmd *cobra.Command, args []string) error {
35+
RunE: func(_ *cobra.Command, _ []string) error {
2336
i := f.UI()
2437
config := f.Config()
2538

@@ -40,199 +53,202 @@ func NewCmdInit(f cmdutil.Factory) *cobra.Command {
4053
return err
4154
}
4255

43-
ws, err := c.GetWorkspaces(api.GetWorkspaces{})
44-
if err != nil {
45-
return err
46-
}
47-
48-
dWorkspace := ""
49-
wsString := make([]string, len(ws))
50-
for i := range ws {
51-
wsString[i] = fmt.Sprintf("%s - %s", ws[i].ID, ws[i].Name)
52-
53-
if ws[i].ID == config.GetString(cmdutil.CONF_WORKSPACE) {
54-
dWorkspace = wsString[i]
55-
}
56-
}
57-
58-
w := ""
59-
if w, err = i.AskFromOptions("Choose default Workspace:",
60-
wsString, dWorkspace); err != nil {
61-
return err
62-
}
63-
config.SetString(cmdutil.CONF_WORKSPACE,
64-
strings.TrimSpace(w[0:strings.Index(w, " - ")]))
65-
66-
users, err := c.WorkspaceUsers(api.WorkspaceUsersParam{
67-
Workspace: config.GetString(cmdutil.CONF_WORKSPACE),
68-
PaginationParam: api.AllPages(),
69-
})
70-
71-
if err != nil {
72-
return err
73-
}
74-
75-
userId := config.GetString(cmdutil.CONF_USER_ID)
76-
dUser := ""
77-
usersString := make([]string, len(users))
78-
for i := range users {
79-
usersString[i] = fmt.Sprintf("%s - %s", users[i].ID, users[i].Name)
80-
81-
if users[i].ID == userId {
82-
dUser = usersString[i]
83-
}
84-
}
85-
86-
userID := ""
87-
if userID, err = i.AskFromOptions(
88-
"Choose your user:", usersString, dUser); err != nil {
89-
return err
90-
}
91-
config.SetString(cmdutil.CONF_USER_ID,
92-
strings.TrimSpace(userID[0:strings.Index(userID, " - ")]))
93-
94-
if err := updateFlag(i, config, cmdutil.CONF_ALLOW_NAME_FOR_ID,
95-
"Should try to find projects/clients/users/tasks/tags by their names?",
56+
if err := queue(
57+
func() error { return setWorkspace(c, config, i) },
58+
func() error { return setUser(c, config, i) },
59+
updateFlag(
60+
i, config, cmdutil.CONF_ALLOW_NAME_FOR_ID,
61+
"Should try to find projects/clients/users/tasks/tags by their names?",
62+
),
63+
func() error {
64+
if !config.IsAllowNameForID() {
65+
return nil
66+
}
67+
68+
return updateFlag(i, config,
69+
cmdutil.CONF_SEARCH_PROJECTS_WITH_CLIENT_NAME,
70+
`Should search projects looking into their `+
71+
`client's name too?`,
72+
)()
73+
},
74+
updateFlag(i, config, cmdutil.CONF_INTERACTIVE,
75+
`Should use "Interactive Mode" by default?`,
76+
),
77+
updateInt(i, config, cmdutil.CONF_INTERACTIVE_PAGE_SIZE,
78+
"How many items should be shown when asking for "+
79+
"projects, tasks or tags?"),
80+
func() error { return setWeekdays(config, i) },
81+
updateFlag(i, config, cmdutil.CONF_ALLOW_INCOMPLETE,
82+
`Should allow starting time entries with incomplete data?`,
83+
),
84+
updateFlag(i, config, cmdutil.CONF_SHOW_TASKS,
85+
`Should show task on time entries as a separated column?`,
86+
),
87+
updateFlag(i, config, cmdutil.CONF_SHOW_CLIENT,
88+
`Should show client on time entries as a separated column?`,
89+
),
90+
updateFlag(i, config, cmdutil.CONF_SHOW_TOTAL_DURATION,
91+
`Should show a line with the sum of `+
92+
`the time entries duration?`,
93+
),
94+
updateFlag(i, config, cmdutil.CONF_DESCR_AUTOCOMP,
95+
`Allow description suggestions using `+
96+
`recent time entries' descriptions?`,
97+
),
98+
func() error {
99+
if !config.GetBool(cmdutil.CONF_DESCR_AUTOCOMP) {
100+
config.SetInt(cmdutil.CONF_DESCR_AUTOCOMP_DAYS, 0)
101+
return nil
102+
}
103+
return updateInt(
104+
i, config, cmdutil.CONF_DESCR_AUTOCOMP_DAYS,
105+
`How many days should be used for a time entry to be `+
106+
`"recent"?`,
107+
)()
108+
},
109+
updateFlag(i, config, cmdutil.CONF_ALLOW_ARCHIVED_TAGS,
110+
"Should suggest and allow creating time entries "+
111+
"with archived tags?",
112+
),
113+
func() error { return setLanguage(i, config) },
96114
); err != nil {
97115
return err
98116
}
99117

100-
if config.IsAllowNameForID() {
101-
if err := updateFlag(i, config,
102-
cmdutil.CONF_SEARCH_PROJECTS_WITH_CLIENT_NAME,
103-
`Should search projects looking into their `+
104-
`client's name too?`,
105-
); err != nil {
106-
return err
107-
}
108-
}
118+
return config.Save()
119+
},
120+
}
109121

110-
if err := updateFlag(i, config, cmdutil.CONF_INTERACTIVE,
111-
`Should use "Interactive Mode" by default?`,
112-
); err != nil {
113-
return err
114-
}
122+
return cmd
123+
}
115124

116-
if err = updateInt(i, config, cmdutil.CONF_INTERACTIVE_PAGE_SIZE,
117-
"How many items should be shown when asking for "+
118-
"projects, tasks or tags?"); err != nil {
119-
return err
120-
}
125+
func setLanguage(i ui.UI, config cmdutil.Config) error {
126+
suggestLanguages := []string{
127+
language.English.String(),
128+
language.German.String(),
129+
language.Afrikaans.String(),
130+
language.Chinese.String(),
131+
language.Portuguese.String(),
132+
}
121133

122-
workweekDays := config.GetStringSlice(cmdutil.CONF_WORKWEEK_DAYS)
123-
if workweekDays, err = i.AskManyFromOptions(
124-
"Which days of the week do you work?",
125-
cmdutil.GetWeekdays(),
126-
workweekDays,
127-
nil,
128-
); err != nil {
129-
return err
130-
}
131-
config.SetStringSlice(cmdutil.CONF_WORKWEEK_DAYS, workweekDays)
134+
lang, err := i.AskForValidText("What is your preferred language:",
135+
func(s string) error {
136+
_, err := language.Parse(s)
137+
return err
138+
},
139+
ui.WithHelp("Accepts any IETF language tag "+
140+
"https://en.wikipedia.org/wiki/IETF_language_tag"),
141+
ui.WithSuggestion(func(toComplete string) []string {
142+
return strhlp.Filter(
143+
strhlp.IsSimilar(toComplete),
144+
suggestLanguages,
145+
)
146+
}),
147+
ui.WithDefault(config.Language().String()),
148+
)
149+
if err != nil {
150+
return err
151+
}
132152

133-
if err := updateFlag(i, config, cmdutil.CONF_ALLOW_INCOMPLETE,
134-
`Should allow starting time entries with incomplete data?`,
135-
); err != nil {
136-
return err
137-
}
153+
config.SetLanguage(language.MustParse(lang))
154+
return nil
155+
}
138156

139-
if err := updateFlag(i, config, cmdutil.CONF_SHOW_TASKS,
140-
`Should show task on time entries as a separated column?`,
141-
); err != nil {
142-
return err
143-
}
157+
func setWeekdays(config cmdutil.Config, i ui.UI) (err error) {
158+
workweekDays := config.GetStringSlice(cmdutil.CONF_WORKWEEK_DAYS)
159+
if workweekDays, err = i.AskManyFromOptions(
160+
"Which days of the week do you work?",
161+
cmdutil.GetWeekdays(),
162+
workweekDays,
163+
nil,
164+
); err != nil {
165+
return err
166+
}
167+
config.SetStringSlice(cmdutil.CONF_WORKWEEK_DAYS, workweekDays)
168+
return nil
169+
}
144170

145-
if err := updateFlag(i, config, cmdutil.CONF_SHOW_CLIENT,
146-
`Should show client on time entries as a separated column?`,
147-
); err != nil {
148-
return err
149-
}
171+
func setUser(c api.Client, config cmdutil.Config, i ui.UI) error {
172+
users, err := c.WorkspaceUsers(api.WorkspaceUsersParam{
173+
Workspace: config.GetString(cmdutil.CONF_WORKSPACE),
174+
PaginationParam: api.AllPages(),
175+
})
150176

151-
if err := updateFlag(i, config, cmdutil.CONF_SHOW_TOTAL_DURATION,
152-
`Should show a line with the sum of `+
153-
`the time entries duration?`,
154-
); err != nil {
155-
return err
156-
}
177+
if err != nil {
178+
return err
179+
}
157180

158-
if err := updateFlag(i, config, cmdutil.CONF_DESCR_AUTOCOMP,
159-
`Allow description suggestions using `+
160-
`recent time entries' descriptions?`,
161-
); err != nil {
162-
return err
163-
}
181+
userID := config.GetString(cmdutil.CONF_USER_ID)
182+
dUser := ""
183+
usersString := make([]string, len(users))
184+
for i := range users {
185+
usersString[i] = fmt.Sprintf("%s - %s", users[i].ID, users[i].Name)
164186

165-
if config.GetBool(cmdutil.CONF_DESCR_AUTOCOMP) {
166-
if err := updateInt(
167-
i, config, cmdutil.CONF_DESCR_AUTOCOMP_DAYS,
168-
`How many days should be used for a time entry to be `+
169-
`"recent"?`,
170-
); err != nil {
171-
return err
172-
}
173-
} else {
174-
config.SetInt(cmdutil.CONF_DESCR_AUTOCOMP_DAYS, 0)
175-
}
187+
if users[i].ID == userID {
188+
dUser = usersString[i]
189+
}
190+
}
176191

177-
if err := updateFlag(i, config, cmdutil.CONF_ALLOW_ARCHIVED_TAGS,
178-
"Should suggest and allow creating time entries "+
179-
"with archived tags?",
180-
); err != nil {
181-
return err
182-
}
192+
if userID, err = i.AskFromOptions(
193+
"Choose your user:", usersString, dUser); err != nil {
194+
return err
195+
}
183196

184-
suggestLanguages := []string{
185-
language.English.String(),
186-
language.German.String(),
187-
language.Afrikaans.String(),
188-
language.Chinese.String(),
189-
language.Portuguese.String(),
190-
}
197+
config.SetString(cmdutil.CONF_USER_ID,
198+
strings.TrimSpace(userID[0:strings.Index(userID, " - ")]))
199+
return nil
200+
}
191201

192-
lang, err := i.AskForValidText("What is your preferred language:",
193-
func(s string) error {
194-
_, err := language.Parse(s)
195-
return err
196-
},
197-
ui.WithHelp("Accepts any IETF language tag "+
198-
"https://en.wikipedia.org/wiki/IETF_language_tag"),
199-
ui.WithSuggestion(func(toComplete string) []string {
200-
return strhlp.Filter(
201-
strhlp.IsSimilar(toComplete),
202-
suggestLanguages,
203-
)
204-
}),
205-
ui.WithDefault(config.Language().String()),
206-
)
207-
if err != nil {
208-
return err
209-
}
202+
func setWorkspace(c api.Client, config cmdutil.Config, i ui.UI) error {
203+
ws, err := c.GetWorkspaces(api.GetWorkspaces{})
204+
if err != nil {
205+
return err
206+
}
210207

211-
config.SetLanguage(language.MustParse(lang))
208+
dWorkspace := ""
209+
wsString := make([]string, len(ws))
210+
for i := range ws {
211+
wsString[i] = fmt.Sprintf("%s - %s", ws[i].ID, ws[i].Name)
212212

213-
return config.Save()
214-
},
213+
if ws[i].ID == config.GetString(cmdutil.CONF_WORKSPACE) {
214+
dWorkspace = wsString[i]
215+
}
215216
}
216217

217-
return cmd
218+
w := ""
219+
if w, err = i.AskFromOptions("Choose default Workspace:",
220+
wsString, dWorkspace); err != nil {
221+
return err
222+
}
223+
config.SetString(cmdutil.CONF_WORKSPACE,
224+
strings.TrimSpace(w[0:strings.Index(w, " - ")]))
225+
return err
218226
}
219227

220-
func updateInt(ui ui.UI, config cmdutil.Config, param, desc string) error {
221-
value := config.GetInt(param)
222-
value, err := ui.AskForInt(desc, value)
223-
if err != nil {
224-
return err
228+
func updateInt(ui ui.UI, config cmdutil.Config, param, desc string,
229+
) func() error {
230+
return func() error {
231+
value := config.GetInt(param)
232+
value, err := ui.AskForInt(desc, value)
233+
if err != nil {
234+
return err
235+
}
236+
config.SetInt(param, value)
237+
return nil
225238
}
226-
config.SetInt(param, value)
227-
return nil
228239
}
229240

230241
func updateFlag(
231-
ui ui.UI, config cmdutil.Config, param, description string) (err error) {
232-
b := config.GetBool(param)
233-
if b, err = ui.Confirm(description, b); err != nil {
242+
ui ui.UI, config cmdutil.Config, param, description string,
243+
) func() error {
244+
return func() (err error) {
245+
246+
b := config.GetBool(param)
247+
if b, err = ui.Confirm(description, b); err != nil {
248+
return
249+
}
250+
config.SetBool(param, b)
234251
return
235252
}
236-
config.SetBool(param, b)
237-
return
253+
238254
}

0 commit comments

Comments
 (0)