@smbcloud / cli / commits / 191e14a

cancel if you want

Seto committed Sep 20, 2025 at 22:00 UTC 191e14a97e5ec272c73bb54068d74e425632327f
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