4 files changed
+42
-15
crates/cli/src/deploy/config.rs
+6
-2
@@ -16,7 +16,10 @@ use {
16
std::{fs, path::Path},
17
};
18
19
-pub(crate) async fn check_config(env: Environment) -> Result<Config, ErrorResponse> {
19
+pub(crate) async fn check_config(
20
+ env: Environment,
21
+ access_token: Option<&str>,
22
+) -> Result<Config, ErrorResponse> {
23
let mut spinner: Spinner = Spinner::new(
24
spinners::Spinners::SimpleDotsScrolling,
25
succeed_message("Checking config"),
@@ -28,7 +31,8 @@ pub(crate) async fn check_config(env: Environment) -> Result<Config, ErrorRespon
31
let config_path = Path::new(".smb/config.toml");
32
if !config_path.exists() {
33
spinner.stop_and_persist(&succeed_symbol(), succeed_message("Setting up deployment"));
31
- setup_project(env).await?;
34
+ // Let's guide the user through the setup process
35
+ setup_project(env, access_token).await?;
36
spinner = Spinner::new(
37
spinners::Spinners::SimpleDotsScrolling,
38
succeed_message("Checking config"),
crates/cli/src/deploy/process_deploy.rs
+1
-1
@@ -36,7 +36,7 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
36
let access_token = get_smb_token(env).await?;
37
38
// Check config.
39
- let config = check_config(env).await?;
39
+ let config = check_config(env, Some(&access_token)).await?;
40
41
// Check runner.
42
let runner = detect_runner().await?;
crates/cli/src/deploy/setup.rs
+34
-11
@@ -14,7 +14,10 @@ use {
14
std::{env, fs, path::Path},
15
};
16
17
-pub async fn setup_project(env: Environment) -> Result<Config, ErrorResponse> {
17
+pub async fn setup_project(
18
+ env: Environment,
19
+ access_token: Option<&str>,
20
+) -> Result<Config, ErrorResponse> {
21
let path = env::current_dir().ok();
22
let path_str = path
23
.as_ref()
@@ -36,13 +39,19 @@ pub async fn setup_project(env: Environment) -> Result<Config, ErrorResponse> {
39
});
40
}
41
39
- let access_token = match get_smb_token(env).await {
40
- Ok(token) => token,
41
- Err(_) => {
42
- return Err(ErrorResponse::Error {
43
- error_code: ErrorCode::Unauthorized,
44
- message: ErrorCode::Unauthorized.message(None).to_string(),
45
- })
42
+ let access_token = match access_token {
43
+ Some(token) => token.to_string(),
44
+ None => {
45
+ let access_token = match get_smb_token(env).await {
46
+ Ok(token) => token,
47
+ Err(_) => {
48
+ return Err(ErrorResponse::Error {
49
+ error_code: ErrorCode::Unauthorized,
50
+ message: ErrorCode::Unauthorized.message(None).to_string(),
51
+ })
52
+ }
53
+ };
54
+ access_token
55
}
56
};
57
@@ -110,14 +119,28 @@ async fn select_project(
119
if !confirm {
120
return create_new_project(env, path).await;
121
}
113
- let selection = Select::with_theme(&ColorfulTheme::default())
122
+ let selection = match Select::with_theme(&ColorfulTheme::default())
123
+ .with_prompt("Use space/enter to select. Press q or esc to create a new project.")
124
.items(&projects)
125
.default(0)
116
- .interact()
126
+ .interact_opt()
127
.map_err(|_| ErrorResponse::Error {
128
error_code: ErrorCode::InputError,
129
message: ErrorCode::InputError.message(None).to_string(),
120
- })?;
130
+ }) {
131
+ Ok(selection) => match selection {
132
+ Some(selection) => selection,
133
+ None => {
134
+ return create_new_project(env, path).await;
135
+ }
136
+ },
137
+ _ => {
138
+ return Err(ErrorResponse::Error {
139
+ error_code: ErrorCode::InputError,
140
+ message: ErrorCode::InputError.message(None).to_string(),
141
+ })
142
+ }
143
+ };
144
145
let project = projects[selection].clone();
146
crates/cli/src/project/deployment.rs
+1
-1
@@ -18,7 +18,7 @@ pub(crate) async fn process_deployment(
18
let mut spinner: Spinner =
19
Spinner::new(spinners::Spinners::Hamburger, succeed_message("Loading"));
20
// Load project id from .smb/config.toml
21
- let config = check_config(env).await?;
21
+ let config = check_config(env, None).await?;
22
23
let access_token = get_smb_token(env).await?;
24