1- use std:: { fs :: remove_dir_all , path:: PathBuf } ;
1+ use std:: path:: PathBuf ;
22
33use devmode:: clone:: CloneAction ;
4+ use devmode:: constants:: names:: { CUSTOM_NAME , NONE , VIM_NAME , VSCODE_NAME } ;
45use devmode:: editor:: Editor ;
56use devmode:: fork:: ForkAction ;
67use devmode:: host:: Host ;
8+ use devmode:: project:: find_paths;
79use devmode:: settings:: Settings ;
810use devmode:: DevmodeError ;
911use devmode:: { application:: Application , Error } ;
1012use requestty:: { Answer , Question } ;
1113use url_builder:: URLBuilder ;
1214
13- pub fn overwrite ( path : PathBuf ) -> Result < bool , Error > {
14- println ! (
15- "Error: {} exists and is not an empty directory" ,
16- path. display( )
17- ) ;
18- let question = requestty:: Question :: confirm ( "overwrite" )
19- . message ( "Do you want to overwrite the existing repository?" )
15+ pub fn confirm ( message : & str , id : & str ) -> Result < bool , Error > {
16+ let question = requestty:: Question :: confirm ( id) . message ( message) . build ( ) ;
17+ let answer = requestty:: prompt_one ( question) ?;
18+ if let Answer :: Bool ( confirm) = answer {
19+ Ok ( confirm)
20+ } else {
21+ Err ( Error :: Unknown )
22+ }
23+ }
24+
25+ pub fn input ( key : & str , message : & str , err : & str ) -> Result < String , Error > {
26+ let question = Question :: input ( key)
27+ . message ( message)
28+ . validate ( |answer, _| {
29+ if answer. is_empty ( ) {
30+ Err ( err. into ( ) )
31+ } else {
32+ Ok ( ( ) )
33+ }
34+ } )
2035 . build ( ) ;
2136 let answer = requestty:: prompt_one ( question) ?;
22- if let requestty:: Answer :: Bool ( overwrite) = answer {
23- if overwrite {
24- remove_dir_all ( & path) ?;
25- return Ok ( overwrite) ;
26- }
37+ if let Answer :: String ( output) = answer {
38+ Ok ( output)
39+ } else {
40+ Err ( Error :: Unknown )
41+ }
42+ }
43+
44+ pub fn select ( key : & str , message : & str , options : Vec < impl Into < String > > ) -> Result < String , Error > {
45+ let question = Question :: select ( key)
46+ . message ( message)
47+ . choices ( options)
48+ . build ( ) ;
49+ let answer = requestty:: prompt_one ( question) ?;
50+ if let Answer :: ListItem ( item) = answer {
51+ Ok ( item. text )
52+ } else {
53+ Err ( Error :: Unknown )
2754 }
28- Ok ( false )
2955}
3056
3157pub fn clone_setup ( ) -> Result < CloneAction , Error > {
3258 let mut url = URLBuilder :: new ( ) ;
3359 url. set_protocol ( "https" ) ;
34- if let Answer :: ListItem ( host) = pick ( "host" , "Choose your Git host:" , vec ! [ "GitHub" , "GitLab" ] ) ?
35- {
36- url. set_host ( Host :: from ( & host. text ) . url ( ) ) ;
37- }
38- if let Answer :: String ( owner) = ask ( "owner" , "Git username:" , "Please enter a Git username." ) ? {
39- url. add_route ( & owner) ;
40- }
41- if let Answer :: String ( repo) = ask ( "repo" , "Git repo name:" , "Please enter a Git repo name." ) ? {
42- url. add_route ( & repo) ;
43- }
60+ let host = select ( "host" , "Choose your Git host:" , vec ! [ "GitHub" , "GitLab" ] ) ?;
61+ url. set_host ( Host :: from ( & host) . url ( ) ) ;
62+ let owner = input ( "owner" , "Git username:" , "Please enter a Git username." ) ?;
63+ url. add_route ( & owner) ;
64+ let repo = input ( "repo" , "Git repo name:" , "Please enter a Git repo name." ) ?;
65+ url. add_route ( & repo) ;
4466
4567 let mut clone = CloneAction :: new ( & url. build ( ) ) ;
4668
@@ -51,32 +73,24 @@ pub fn clone_setup() -> Result<CloneAction, Error> {
5173 . iter ( )
5274 . map ( |s| s. as_str ( ) )
5375 . collect ( ) ;
54- options. insert ( 0 , "None" ) ;
55- if let Answer :: ListItem ( workspace) = pick ( "workspace" , "Pick a workspace" , options) ? {
56- let workspace = workspace. text . to_lowercase ( ) ;
57- if !workspace. eq ( "none" ) {
58- clone. set_workspace ( workspace) ;
59- }
76+ options. insert ( 0 , NONE ) ;
77+ let workspace = select ( "workspace" , "Pick a workspace" , options) ?;
78+ if !workspace. eq ( NONE ) {
79+ clone. set_workspace ( workspace) ;
6080 }
6181 Ok ( clone)
6282}
6383
6484pub fn fork_setup ( ) -> Result < ForkAction , Error > {
6585 let mut fork = ForkAction :: new ( ) ;
66- if let Answer :: ListItem ( host) = pick ( "host" , "Choose your Git host:" , vec ! [ "GitHub" , "GitLab" ] ) ?
67- {
68- fork. host = Host :: from ( & host. text ) ;
69- }
70- if let Answer :: String ( owner) = ask ( "owner" , "Git username:" , "Please enter a Git username." ) ? {
71- fork. owner = owner;
72- }
73- if let Answer :: String ( repo) = ask ( "repo" , "Git repo name:" , "Please enter a Git repo name." ) ? {
74- fork. repo = repo;
75- }
76- if let Answer :: String ( repo) = ask ( "upstream" , "Upstream URL:" , "Please enter an upstream URL." ) ?
77- {
78- fork. upstream = repo;
79- }
86+ let host = select ( "host" , "Choose your Git host:" , vec ! [ "GitHub" , "GitLab" ] ) ?;
87+ fork. host = Host :: from ( & host) ;
88+ let owner = input ( "owner" , "Git username:" , "Please enter a Git username." ) ?;
89+ fork. owner = owner;
90+ let repo = input ( "repo" , "Git repo name:" , "Please enter a Git repo name." ) ?;
91+ fork. repo = repo;
92+ let repo = input ( "upstream" , "Upstream URL:" , "Please enter an upstream URL." ) ?;
93+ fork. upstream = repo;
8094 Ok ( fork)
8195}
8296
@@ -91,69 +105,34 @@ pub fn config_all() -> Result<Settings, Error> {
91105}
92106
93107pub fn config_owner ( ) -> Result < Settings , Error > {
94- let answer = ask ( "owner" , "Git username:" , "Please enter a Git username." ) ?;
95- let owner = match answer {
96- Answer :: String ( owner) => owner,
97- _ => return devmode:: error ( "Owner is required." ) ,
98- } ;
99- let current = Settings :: current ( ) ;
100- let settings = match current {
101- None => Settings {
102- owner,
103- ..Default :: default ( )
104- } ,
105- Some ( mut settings) => {
106- settings. owner = owner;
107- settings
108- }
109- } ;
108+ let owner = input ( "owner" , "Git username:" , "Please enter a Git username." ) ?;
109+ let mut settings = Settings :: current ( ) . unwrap_or_default ( ) ;
110+ settings. owner = owner;
110111 Ok ( settings)
111112}
112113
113114pub fn config_host ( ) -> Result < Settings , Error > {
114- let answer = pick ( "host" , "Choose your Git host:" , vec ! [ "GitHub" , "GitLab" ] ) ?;
115- let host = match answer {
116- Answer :: ListItem ( item) => Host :: from ( & item. text ) . to_string ( ) ,
117- _ => return devmode:: error ( "Host is required." ) ,
118- } ;
119- let current = Settings :: current ( ) ;
120- let settings = match current {
121- None => Settings {
122- host,
123- ..Default :: default ( )
124- } ,
125- Some ( mut settings) => {
126- settings. host = host;
127- settings
128- }
129- } ;
115+ let host = select ( "host" , "Choose your Git host:" , vec ! [ "GitHub" , "GitLab" ] ) ?;
116+ let mut settings = Settings :: current ( ) . unwrap_or_default ( ) ;
117+ settings. host = host;
130118 Ok ( settings)
131119}
132120
133121pub fn config_editor ( ) -> Result < Settings , Error > {
134- let answer = pick (
122+ let editor = select (
135123 "editor" ,
136124 "Choose your favorite editor:" ,
137- vec ! [ "Vim" , "VSCode" , "Custom" ] ,
125+ vec ! [ VIM_NAME , VSCODE_NAME , CUSTOM_NAME ] ,
138126 ) ?;
139- let editor = match answer {
140- Answer :: ListItem ( item) => {
141- if item. text . to_lowercase ( ) == "custom" {
142- let answer = ask (
143- "command" ,
144- "Editor command:" ,
145- "Please enter a editor command." ,
146- ) ?;
147- if let Answer :: String ( name) = answer {
148- Editor :: custom ( name)
149- } else {
150- return devmode:: error ( "Editor name is required." ) ;
151- }
152- } else {
153- Editor :: new ( Application :: from ( & item. text ) )
154- }
155- }
156- _ => return devmode:: error ( "Editor must be picked." ) ,
127+ let editor = if editor. eq ( CUSTOM_NAME ) {
128+ let command = input (
129+ "command" ,
130+ "Editor command:" ,
131+ "Please enter a editor command." ,
132+ ) ?;
133+ Editor :: custom ( command)
134+ } else {
135+ Editor :: new ( Application :: from ( & editor) )
157136 } ;
158137 let current = Settings :: current ( ) ;
159138 let settings = match current {
@@ -169,37 +148,29 @@ pub fn config_editor() -> Result<Settings, Error> {
169148 Ok ( settings)
170149}
171150
172- pub fn select_repo ( paths : Vec < & str > ) -> Result < String , Error > {
173- let answer = pick ( "repo" , "Select the repository you want to open:" , paths) ?;
174- let repo = match answer {
175- Answer :: ListItem ( item) => item. text ,
176- _ => return devmode:: error ( "Repository must be picked." ) ,
151+ pub fn select_repo ( project : & str , workspace : Option < & str > ) -> Result < PathBuf , Error > {
152+ let paths = if let Some ( workspace) = workspace {
153+ find_paths ( project) ?
154+ . iter ( )
155+ . filter ( |path| path. display ( ) . to_string ( ) . contains ( & workspace) )
156+ . map ( |path| path. display ( ) . to_string ( ) . to_owned ( ) )
157+ . collect :: < Vec < String > > ( )
158+ } else {
159+ find_paths ( project) ?
160+ . iter ( )
161+ . map ( |path| path. display ( ) . to_string ( ) . to_owned ( ) )
162+ . collect :: < Vec < String > > ( )
177163 } ;
178- Ok ( repo)
164+ let repo = select ( "repo" , "Select the repository you want to open:" , paths) ?;
165+ Ok ( PathBuf :: from ( repo) )
179166}
180167
181- pub fn ask ( key : & str , message : & str , err : & str ) -> Result < Answer , Error > {
182- requestty:: prompt_one (
183- Question :: input ( key)
184- . message ( message)
185- . validate ( |owner, _previous| {
186- if owner. is_empty ( ) {
187- Err ( err. into ( ) )
188- } else {
189- Ok ( ( ) )
190- }
191- } )
192- . build ( ) ,
193- )
194- . map_err ( |e| Error :: String ( e. to_string ( ) ) )
168+ pub fn create_workspace ( ) -> Result < bool , Error > {
169+ let create = confirm ( "workspace" , "Would you like to create this workspace?" ) ?;
170+ Ok ( create)
195171}
196172
197- pub fn pick ( key : & str , message : & str , options : Vec < & str > ) -> Result < Answer , Error > {
198- requestty:: prompt_one (
199- Question :: select ( key)
200- . message ( message)
201- . choices ( options)
202- . build ( ) ,
203- )
204- . map_err ( |e| Error :: String ( e. to_string ( ) ) )
173+ pub fn overwrite ( ) -> Result < bool , Error > {
174+ let overwrite = confirm ( "overwrite" , "Found existing repository, overwrite it?" ) ?;
175+ Ok ( overwrite)
205176}
0 commit comments