1- use crate :: {
2- deploy:: config:: { Config , ConfigError } ,
3- ui:: highlight,
4- } ;
1+ use crate :: { deploy:: config:: Config , ui:: highlight} ;
52use dialoguer:: { theme:: ColorfulTheme , Confirm , Input , Select } ;
63use regex:: Regex ;
7- use smbcloud_model:: project:: { Project , ProjectCreate } ;
4+ use smbcloud_model:: {
5+ error_codes:: { ErrorCode , ErrorResponse } ,
6+ project:: { Project , ProjectCreate } ,
7+ } ;
88use smbcloud_networking:: { environment:: Environment , get_smb_token} ;
99use smbcloud_networking_project:: {
1010 crud_project_create:: create_project, crud_project_read:: get_projects,
1111} ;
1212use std:: { env, fs, path:: Path } ;
1313
14- pub async fn setup_project ( env : Environment ) -> Result < Config , ConfigError > {
14+ pub async fn setup_project ( env : Environment ) -> Result < Config , ErrorResponse > {
1515 let path = env:: current_dir ( ) . ok ( ) ;
1616 let path_str = path
1717 . as_ref ( )
@@ -21,20 +21,36 @@ pub async fn setup_project(env: Environment) -> Result<Config, ConfigError> {
2121 let confirm = Confirm :: with_theme ( & ColorfulTheme :: default ( ) )
2222 . with_prompt ( format ! ( "Setup project in {}? y/n" , highlight( & path_str) ) )
2323 . interact ( )
24- . map_err ( |_| ConfigError :: InputError ) ?;
24+ . map_err ( |_| ErrorResponse :: Error {
25+ error_code : ErrorCode :: InputError ,
26+ message : ErrorCode :: InputError . message ( None ) . to_string ( ) ,
27+ } ) ?;
2528
2629 if !confirm {
27- return Err ( ConfigError :: Cancel ) ;
30+ return Err ( ErrorResponse :: Error {
31+ error_code : ErrorCode :: Cancel ,
32+ message : ErrorCode :: Cancel . message ( None ) . to_string ( ) ,
33+ } ) ;
2834 }
2935
3036 let access_token = match get_smb_token ( env) . await {
3137 Ok ( token) => token,
32- Err ( _) => return Err ( ConfigError :: MissingToken ) ,
38+ Err ( _) => {
39+ return Err ( ErrorResponse :: Error {
40+ error_code : ErrorCode :: Unauthorized ,
41+ message : ErrorCode :: Unauthorized . message ( None ) . to_string ( ) ,
42+ } )
43+ }
3344 } ;
3445
3546 let projects = match get_projects ( env, access_token) . await {
3647 Ok ( x) => x,
37- Err ( _) => return Err ( ConfigError :: InputError ) ,
48+ Err ( _) => {
49+ return Err ( ErrorResponse :: Error {
50+ error_code : ErrorCode :: InputError ,
51+ message : ErrorCode :: InputError . message ( None ) . to_string ( ) ,
52+ } )
53+ }
3854 } ;
3955
4056 let project: Project = if !projects. is_empty ( ) {
@@ -56,12 +72,21 @@ pub async fn setup_project(env: Environment) -> Result<Config, ConfigError> {
5672 // Ensure .smb directory exists
5773 let smb_dir = Path :: new ( ".smb" ) ;
5874 if !smb_dir. exists ( ) {
59- fs:: create_dir ( smb_dir) . map_err ( |_| ConfigError :: MissingConfig ) ?;
75+ fs:: create_dir ( smb_dir) . map_err ( |_| ErrorResponse :: Error {
76+ error_code : ErrorCode :: MissingConfig ,
77+ message : ErrorCode :: MissingConfig . message ( None ) . to_string ( ) ,
78+ } ) ?;
6079 }
6180
6281 // Write config to .smb/config.toml
63- let config_toml = toml:: to_string ( & config) . map_err ( |_| ConfigError :: MissingConfig ) ?;
64- fs:: write ( ".smb/config.toml" , config_toml) . map_err ( |_| ConfigError :: MissingConfig ) ?;
82+ let config_toml = toml:: to_string ( & config) . map_err ( |_| ErrorResponse :: Error {
83+ error_code : ErrorCode :: MissingConfig ,
84+ message : ErrorCode :: MissingConfig . message ( None ) . to_string ( ) ,
85+ } ) ?;
86+ fs:: write ( ".smb/config.toml" , config_toml) . map_err ( |_| ErrorResponse :: Error {
87+ error_code : ErrorCode :: MissingConfig ,
88+ message : ErrorCode :: MissingConfig . message ( None ) . to_string ( ) ,
89+ } ) ?;
6590
6691 Ok ( config)
6792}
@@ -70,11 +95,14 @@ async fn select_project(
7095 env : Environment ,
7196 projects : Vec < Project > ,
7297 path : & str ,
73- ) -> Result < Project , ConfigError > {
98+ ) -> Result < Project , ErrorResponse > {
7499 let confirm = Confirm :: with_theme ( & ColorfulTheme :: default ( ) )
75100 . with_prompt ( "Use existing project? y/n" )
76101 . interact ( )
77- . map_err ( |_| ConfigError :: InputError ) ?;
102+ . map_err ( |_| ErrorResponse :: Error {
103+ error_code : ErrorCode :: InputError ,
104+ message : ErrorCode :: InputError . message ( None ) . to_string ( ) ,
105+ } ) ?;
78106
79107 if !confirm {
80108 return create_new_project ( env, path) . await ;
@@ -83,18 +111,24 @@ async fn select_project(
83111 . items ( & projects)
84112 . default ( 0 )
85113 . interact ( )
86- . map_err ( |_| ConfigError :: InputError ) ?;
114+ . map_err ( |_| ErrorResponse :: Error {
115+ error_code : ErrorCode :: InputError ,
116+ message : ErrorCode :: InputError . message ( None ) . to_string ( ) ,
117+ } ) ?;
87118
88119 let project = projects[ selection] . clone ( ) ;
89120
90121 Ok ( project)
91122}
92123
93- async fn create_new_project ( env : Environment , path : & str ) -> Result < Project , ConfigError > {
124+ async fn create_new_project ( env : Environment , path : & str ) -> Result < Project , ErrorResponse > {
94125 let default_name = Path :: new ( path)
95126 . file_name ( )
96127 . and_then ( |os_str| os_str. to_str ( ) )
97- . unwrap_or ( "project" ) ;
128+ . unwrap_or ( "project" )
129+ . to_lowercase ( )
130+ . replace ( [ ' ' , '-' ] , "" )
131+ . replace ( '-' , "" ) ;
98132
99133 let name = match Input :: < String > :: with_theme ( & ColorfulTheme :: default ( ) )
100134 . with_prompt ( "Project name" )
@@ -103,7 +137,10 @@ async fn create_new_project(env: Environment, path: &str) -> Result<Project, Con
103137 {
104138 Ok ( project_name) => project_name,
105139 Err ( _) => {
106- return Err ( ConfigError :: InputError ) ;
140+ return Err ( ErrorResponse :: Error {
141+ error_code : ErrorCode :: InputError ,
142+ message : ErrorCode :: InputError . message ( None ) . to_string ( ) ,
143+ } ) ;
107144 }
108145 } ;
109146
@@ -123,7 +160,10 @@ async fn create_new_project(env: Environment, path: &str) -> Result<Project, Con
123160 {
124161 Ok ( repo) => repo,
125162 Err ( _) => {
126- return Err ( ConfigError :: InputError ) ;
163+ return Err ( ErrorResponse :: Error {
164+ error_code : ErrorCode :: InputError ,
165+ message : ErrorCode :: InputError . message ( None ) . to_string ( ) ,
166+ } ) ;
127167 }
128168 } ;
129169
@@ -133,13 +173,21 @@ async fn create_new_project(env: Environment, path: &str) -> Result<Project, Con
133173 {
134174 Ok ( description) => description,
135175 Err ( _) => {
136- return Err ( ConfigError :: InputError ) ;
176+ return Err ( ErrorResponse :: Error {
177+ error_code : ErrorCode :: InputError ,
178+ message : ErrorCode :: InputError . message ( None ) . to_string ( ) ,
179+ } ) ;
137180 }
138181 } ;
139182
140183 let access_token = match get_smb_token ( env) . await {
141184 Ok ( token) => token,
142- Err ( _) => return Err ( ConfigError :: MissingToken ) ,
185+ Err ( _) => {
186+ return Err ( ErrorResponse :: Error {
187+ error_code : ErrorCode :: Unauthorized ,
188+ message : ErrorCode :: Unauthorized . message ( None ) . to_string ( ) ,
189+ } )
190+ }
143191 } ;
144192
145193 match create_project (
@@ -154,6 +202,6 @@ async fn create_new_project(env: Environment, path: &str) -> Result<Project, Con
154202 . await
155203 {
156204 Ok ( project) => Ok ( project) ,
157- Err ( _ ) => Err ( ConfigError :: MissingConfig ) ,
205+ Err ( e ) => Err ( e ) ,
158206 }
159207}
0 commit comments