@smbcloud / cli / commits / 8676a71

add SmbClient enum

Seto committed Dec 22, 2025 at 15:22 UTC 8676a7135d0e71f9c3b0002da9ba8f90f61d54d6
21 files changed +93 -35
Cargo.lock
+1
@@ -2142,6 +2142,7 @@ version = "0.3.25"
2142 dependencies = [
2143 "serde-wasm-bindgen",
2144 "smbcloud-network",
2145 + "smbcloud-networking",
2146 "smbcloud-networking-account",
2147 "wasm-bindgen",
2148 "wasm-bindgen-futures",
crates/cli/src/account/forgot/mod.rs
+4 -2
@@ -7,7 +7,9 @@ use dialoguer::{theme::ColorfulTheme, Input, Password};
7 use reqwest::{Client, StatusCode};
8 use smbcloud_model::forgot::{Args, Email, Param, UserUpdatePassword};
9 use smbcloud_network::environment::Environment;
10 -use smbcloud_networking::{constants::PATH_USERS_PASSWORD, smb_base_url_builder};
10 +use smbcloud_networking::{
11 + constants::PATH_USERS_PASSWORD, smb_base_url_builder, smb_client::SmbClient,
12 +};
13 use smbcloud_utils::email_validation;
14 use spinners::Spinner;
15
@@ -115,7 +117,7 @@ async fn input_code(env: Environment) -> Result<CommandResult> {
117 }
118
119 fn build_smb_forgot_url(env: Environment) -> String {
118 - let mut url_builder = smb_base_url_builder(env);
120 + let mut url_builder = smb_base_url_builder(env, &SmbClient::Cli);
121 url_builder.add_route(PATH_USERS_PASSWORD);
122 url_builder.build()
123 }
crates/cli/src/account/lib.rs
+2 -1
@@ -12,6 +12,7 @@ use {
12 GH_OAUTH_CLIENT_ID, GH_OAUTH_REDIRECT_HOST, GH_OAUTH_REDIRECT_PORT, PATH_AUTHORIZE,
13 },
14 smb_base_url_builder,
15 + smb_client::SmbClient,
16 },
17 spinners::Spinner,
18 std::{
@@ -192,7 +193,7 @@ pub async fn process_connect_github(env: Environment, code: String) -> Result<Sm
193 }
194
195 fn build_authorize_smb_url(env: Environment) -> String {
195 - let mut url_builder = smb_base_url_builder(env);
196 + let mut url_builder = smb_base_url_builder(env, &SmbClient::Cli);
197 url_builder.add_route(PATH_AUTHORIZE);
198 url_builder.build()
199 }
crates/cli/src/account/login/process.rs
+7 -6
@@ -32,6 +32,7 @@ use {
32 PATH_USERS_PASSWORD,
33 },
34 smb_base_url_builder,
35 + smb_client::SmbClient,
36 },
37 smbcloud_networking_account::{check_email::check_email, login::login},
38 smbcloud_utils::email_validation,
@@ -301,7 +302,7 @@ async fn login_with_email(env: Environment) -> Result<CommandResult> {
302 }
303 };
304
304 - match check_email(env, &username).await {
305 + match check_email(env, SmbClient::Cli, &username).await {
306 Ok(auth) => {
307 // Only continue with password input if email is found and confirmed.
308 if auth.error_code.is_some() {
@@ -336,7 +337,7 @@ async fn do_process_login(env: Environment, args: LoginArgs) -> Result<CommandRe
337 spinners::Spinners::SimpleDotsScrolling,
338 succeed_message("Loading"),
339 );
339 - let account_status = match login(env, args.username, args.password).await {
340 + let account_status = match login(env, SmbClient::Cli, args.username, args.password).await {
341 Ok(response) => response,
342 Err(_) => return Err(anyhow!(fail_message("Check your internet connection."))),
343 };
@@ -554,25 +555,25 @@ async fn input_reset_password_token(env: Environment) -> Result<CommandResult> {
555 }
556
557 fn build_smb_resend_email_verification_url(env: Environment) -> String {
557 - let mut url_builder = smb_base_url_builder(env);
558 + let mut url_builder = smb_base_url_builder(env, &SmbClient::Cli);
559 url_builder.add_route(PATH_RESEND_CONFIRMATION);
560 url_builder.build()
561 }
562
563 fn build_smb_resend_reset_password_instructions_url(env: Environment) -> String {
563 - let mut url_builder = smb_base_url_builder(env);
564 + let mut url_builder = smb_base_url_builder(env, &SmbClient::Cli);
565 url_builder.add_route(PATH_RESET_PASSWORD_INSTRUCTIONS);
566 url_builder.build()
567 }
568
569 fn build_smb_reset_password_url(env: Environment) -> String {
569 - let mut url_builder = smb_base_url_builder(env);
570 + let mut url_builder = smb_base_url_builder(env, &SmbClient::Cli);
571 url_builder.add_route(PATH_USERS_PASSWORD);
572 url_builder.build()
573 }
574
575 fn build_smb_connect_github_url(env: Environment) -> String {
575 - let mut url_builder = smb_base_url_builder(env);
576 + let mut url_builder = smb_base_url_builder(env, &SmbClient::Cli);
577 url_builder.add_route(PATH_LINK_GITHUB_ACCOUNT);
578 url_builder.build()
579 }
crates/cli/src/account/logout/mod.rs
+2 -1
@@ -7,6 +7,7 @@ use {
7 anyhow::{anyhow, Result},
8 dialoguer::{theme::ColorfulTheme, Confirm},
9 smbcloud_network::environment::Environment,
10 + smbcloud_networking::smb_client::SmbClient,
11 smbcloud_networking_account::logout::logout,
12 spinners::Spinner,
13 std::fs,
@@ -67,7 +68,7 @@ pub async fn process_logout(env: Environment) -> Result<CommandResult> {
68
69 async fn do_process_logout(env: Environment) -> Result<()> {
70 let token = get_smb_token(env)?;
70 - match logout(env, token).await {
71 + match logout(env, SmbClient::Cli, token).await {
72 Ok(_) => Ok(()),
73 Err(e) => Err(anyhow!("{e}")),
74 }
crates/cli/src/account/me/mod.rs
+2 -1
@@ -7,6 +7,7 @@ use crate::{
7 use anyhow::Result;
8 use smbcloud_model::account::User;
9 use smbcloud_network::environment::Environment;
10 +use smbcloud_networking::smb_client::SmbClient;
11 use smbcloud_networking_account::me::me;
12 use spinners::Spinner;
13 use tabled::{Table, Tabled};
@@ -50,7 +51,7 @@ pub async fn process_me(env: Environment) -> Result<CommandResult> {
51 succeed_message("Loading"),
52 );
53 let token = get_smb_token(env)?;
53 - match me(env, &token).await {
54 + match me(env, SmbClient::Cli, &token).await {
55 Ok(user) => {
56 spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
57 show_user(&user);
crates/cli/src/account/signup/process.rs
+1 -1
@@ -171,7 +171,7 @@ pub async fn do_signup_email(
171 }
172
173 fn build_smb_signup_url(env: Environment) -> String {
174 - let mut url_builder = smb_base_url_builder(env);
174 + let mut url_builder = smb_base_url_builder(env, &SmbClient::Cli);
175 url_builder.add_route(PATH_USERS);
176 url_builder.build()
177 }
crates/cli/src/deploy/config.rs
+9 -1
@@ -9,6 +9,7 @@ use {
9 error_codes::{ErrorCode, ErrorResponse},
10 },
11 smbcloud_network::environment::Environment,
12 + smbcloud_networking::smb_client::SmbClient,
13 smbcloud_networking_project::crud_project_read::get_project,
14 smbcloud_utils::config::Config,
15 spinners::Spinner,
@@ -74,7 +75,14 @@ pub(crate) async fn check_project(
75 spinners::Spinners::Hamburger,
76 succeed_message("Validate project"),
77 );
77 - match get_project(env, access_token.to_string(), id.to_string()).await {
78 + match get_project(
79 + env,
80 + SmbClient::Cli,
81 + access_token.to_string(),
82 + id.to_string(),
83 + )
84 + .await
85 + {
86 Ok(_) => {
87 spinner.stop_and_persist(&succeed_symbol(), succeed_message("Valid project"));
88 Ok(())
crates/cli/src/deploy/process_deploy.rs
+12 -3
@@ -15,6 +15,7 @@ use {
15 git2::{PushOptions, RemoteCallbacks, Repository},
16 smbcloud_model::project::{DeploymentPayload, DeploymentStatus},
17 smbcloud_network::environment::Environment,
18 + smbcloud_networking::smb_client::SmbClient,
19 smbcloud_networking_account::me::me,
20 smbcloud_networking_project::{
21 crud_project_deployment_create::create_deployment, crud_project_deployment_update::update,
@@ -103,9 +104,15 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
104 status: DeploymentStatus::Started,
105 };
106
106 - let created_deployment =
107 - create_deployment(env, &access_token, config.project.id, payload).await?;
108 - let user = me(env, &access_token).await?;
107 + let created_deployment = create_deployment(
108 + env,
109 + SmbClient::Cli,
110 + &access_token,
111 + config.project.id,
112 + payload,
113 + )
114 + .await?;
115 + let user = me(env, SmbClient::Cli, &access_token).await?;
116
117 let mut push_opts = PushOptions::new();
118 let mut callbacks = RemoteCallbacks::new();
@@ -158,6 +165,7 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
165 let result = handle.block_on(async {
166 update(
167 update_env, // Env is Copy
168 + SmbClient::Cli,
169 access_token_for_update_cb.clone(),
170 project_id_for_update_cb,
171 deployment_id_for_update_cb,
@@ -193,6 +201,7 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
201 };
202 let result = update(
203 env,
204 + SmbClient::Cli,
205 access_token.clone(),
206 config.project.id,
207 created_deployment.id,
crates/cli/src/deploy/setup_create_new_project.rs
+2
@@ -8,6 +8,7 @@ use {
8 runner::Runner,
9 },
10 smbcloud_network::environment::Environment,
11 + smbcloud_networking::smb_client::SmbClient,
12 smbcloud_networking_project::crud_project_create::create_project,
13 std::path::Path,
14 };
@@ -94,6 +95,7 @@ pub(crate) async fn create_new_project(
95
96 match create_project(
97 env,
98 + SmbClient::Cli,
99 access_token,
100 ProjectCreate {
101 name,
crates/cli/src/deploy/setup_project.rs
+2 -1
@@ -12,6 +12,7 @@ use {
12 project::Project,
13 },
14 smbcloud_network::environment::Environment,
15 + smbcloud_networking::smb_client::SmbClient,
16 smbcloud_networking_project::crud_project_read::get_projects,
17 smbcloud_utils::config::Config,
18 std::{env, fs, path::Path},
@@ -55,7 +56,7 @@ pub(crate) async fn setup_project(
56 },
57 };
58
58 - let projects = get_projects(env, access_token.to_string()).await?;
59 + let projects = get_projects(env, SmbClient::Cli, access_token.to_string()).await?;
60
61 let project: Project = if !projects.is_empty() {
62 select_project(env, projects, &path_str).await?
crates/cli/src/project/crud_create.rs
+2
@@ -13,6 +13,7 @@ use dialoguer::{theme::ColorfulTheme, Input};
13 use smbcloud_model::project::ProjectCreate;
14 use smbcloud_model::runner::Runner;
15 use smbcloud_network::environment::Environment;
16 +use smbcloud_networking::smb_client::SmbClient;
17 use smbcloud_networking_project::crud_project_create::create_project;
18 use spinners::Spinner;
19
@@ -74,6 +75,7 @@ pub async fn process_project_init(
75 let access_token = get_smb_token(env)?;
76 match create_project(
77 env,
78 + SmbClient::Cli,
79 access_token,
80 ProjectCreate {
81 name: project_name.clone(),
crates/cli/src/project/crud_delete.rs
+2 -1
@@ -7,6 +7,7 @@ use crate::{
7 use anyhow::{anyhow, Result};
8 use dialoguer::{theme::ColorfulTheme, Input};
9 use smbcloud_network::environment::Environment;
10 +use smbcloud_networking::smb_client::SmbClient;
11 use smbcloud_networking_project::crud_project_delete::delete_project;
12 use spinners::Spinner;
13
@@ -33,7 +34,7 @@ pub async fn process_project_delete(env: Environment, id: String) -> Result<Comm
34 });
35 }
36 let access_token = get_smb_token(env)?;
36 - match delete_project(env, access_token, id).await {
37 + match delete_project(env, SmbClient::Cli, access_token, id).await {
38 Ok(_) => Ok(CommandResult {
39 spinner,
40 symbol: succeed_symbol(),
crates/cli/src/project/crud_read.rs
+4 -3
@@ -9,6 +9,7 @@ use anyhow::{anyhow, Result};
9 use log::debug;
10 use smbcloud_model::project::{Config, Project};
11 use smbcloud_network::environment::Environment;
12 +use smbcloud_networking::smb_client::SmbClient;
13 use smbcloud_networking_project::crud_project_read::{get_project, get_projects};
14 use spinners::Spinner;
15 use tabled::{Table, Tabled};
@@ -49,7 +50,7 @@ pub async fn process_project_list(env: Environment) -> Result<CommandResult> {
50 succeed_message("Loading"),
51 );
52 let token = get_smb_token(env)?;
52 - match get_projects(env, token).await {
53 + match get_projects(env, SmbClient::Cli, token).await {
54 Ok(projects) => {
55 spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
56 let msg = if projects.is_empty() {
@@ -84,7 +85,7 @@ pub async fn process_project_show(env: Environment, id: String) -> Result<Comman
85 succeed_message("Loading"),
86 );
87 let access_token = get_smb_token(env)?;
87 - match get_project(env, access_token, id).await {
88 + match get_project(env, SmbClient::Cli, access_token, id).await {
89 Ok(project) => {
90 spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
91 let message = succeed_message(&format!("Showing project {}.", &project.name));
@@ -138,7 +139,7 @@ pub(crate) fn show_project_detail(project: &Project) {
139
140 pub(crate) async fn process_project_use(env: Environment, id: String) -> Result<CommandResult> {
141 let access_token = get_smb_token(env)?;
141 - let project = get_project(env, access_token, id).await?;
142 + let project = get_project(env, SmbClient::Cli, access_token, id).await?;
143
144 let config = Config {
145 current_project: Some(project),
crates/cli/src/project/crud_update.rs
+17 -2
@@ -3,6 +3,7 @@ use anyhow::{anyhow, Result};
3 use dialoguer::{console::Term, theme::ColorfulTheme, Input, Select};
4 use smbcloud_model::runner::Runner;
5 use smbcloud_network::environment::Environment;
6 +use smbcloud_networking::smb_client::SmbClient;
7 use smbcloud_networking_project::{
8 crud_project_read::get_project, crud_project_update::update_project,
9 };
@@ -22,7 +23,13 @@ pub async fn process_project_update(env: Environment, project_id: String) -> Res
23 }
24
25 let access_token = get_smb_token(env)?;
25 - let project = get_project(env, access_token.clone(), project_id.clone()).await?;
26 + let project = get_project(
27 + env,
28 + SmbClient::Cli,
29 + access_token.clone(),
30 + project_id.clone(),
31 + )
32 + .await?;
33
34 if let Some(project_description) = project.description {
35 println!("Description: {}", description(&project_description));
@@ -50,7 +57,15 @@ pub async fn process_project_update(env: Environment, project_id: String) -> Res
57 spinners::Spinners::SimpleDotsScrolling,
58 succeed_message("Loading"),
59 );
53 - update_project(env, access_token, project_id, &new_description, runner).await?;
60 + update_project(
61 + env,
62 + SmbClient::Cli,
63 + access_token,
64 + project_id,
65 + &new_description,
66 + runner,
67 + )
68 + .await?;
69 Ok(CommandResult {
70 spinner,
71 symbol: succeed_symbol(),
crates/cli/src/project/deployment.rs
+11 -3
@@ -7,6 +7,7 @@ use crate::{
7 use anyhow::Result;
8 use smbcloud_model::project::Deployment;
9 use smbcloud_network::environment::Environment;
10 +use smbcloud_networking::smb_client::SmbClient;
11 use smbcloud_networking_project::crud_project_deployment_read::{get_deployment, get_deployments};
12 use spinners::Spinner;
13 use tabled::{Table, Tabled};
@@ -27,14 +28,21 @@ pub(crate) async fn process_deployment(
28 if let Some(deployment_id) = id {
29 // Show detail for a specific deployment
30 let deployment_id: i32 = deployment_id.parse()?;
30 - let deployment =
31 - get_deployment(env, access_token, config.project.id, deployment_id).await?;
31 + let deployment = get_deployment(
32 + env,
33 + SmbClient::Cli,
34 + access_token,
35 + config.project.id,
36 + deployment_id,
37 + )
38 + .await?;
39 spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded"));
40 show_deployment_detail(&deployment);
41 } else {
42 // List all deployments for the project
43 let access_token = get_smb_token(env)?;
37 - let deployments = get_deployments(env, access_token, config.project.id).await?;
44 + let deployments =
45 + get_deployments(env, SmbClient::Cli, access_token, config.project.id).await?;
46 spinner.stop_and_persist(&succeed_symbol(), succeed_message("Load all deployments"));
47 show_project_deployments(&deployments);
48 };
crates/cli/src/token/is_logged_in.rs
+3 -3
@@ -1,7 +1,7 @@
1 use {
2 crate::token::get_smb_token::get_smb_token, smbcloud_model::error_codes::ErrorResponse,
3 - smbcloud_network::environment::Environment, smbcloud_networking_account::me::me,
4 - tracing::debug,
3 + smbcloud_network::environment::Environment, smbcloud_networking::smb_client::SmbClient,
4 + smbcloud_networking_account::me::me, tracing::debug,
5 };
6
7 pub async fn is_logged_in(env: Environment) -> Result<bool, ErrorResponse> {
@@ -10,7 +10,7 @@ pub async fn is_logged_in(env: Environment) -> Result<bool, ErrorResponse> {
10 Ok(token) => token,
11 Err(_) => return Ok(false),
12 };
13 - match me(env, &access_token).await {
13 + match me(env, SmbClient::Cli, &access_token).await {
14 Ok(user) => {
15 debug!("Authorized as: {:?}", user.id);
16 Ok(true)
crates/smbcloud-networking-account-wasm/Cargo.toml
+1
@@ -23,6 +23,7 @@ crate-type = ["cdylib", "rlib"]
23 [dependencies]
24 serde-wasm-bindgen = "=0.6.5"
25 smbcloud-network = { workspace = true }
26 +smbcloud-networking = { workspace = true }
27 smbcloud-networking-account = { workspace = true }
28 wasm-bindgen = { workspace = true }
29 wasm-bindgen-futures = "0.4.50"
crates/smbcloud-networking-account-wasm/src/login.rs
+2 -1
@@ -1,4 +1,5 @@
1 use smbcloud_network::environment::Environment;
2 +use smbcloud_networking::smb_client::SmbClient;
3 use wasm_bindgen::JsValue;
4 use wasm_bindgen::prelude::wasm_bindgen;
5
@@ -8,7 +9,7 @@ pub async fn login(
9 username: String,
10 password: String,
11 ) -> Result<JsValue, JsValue> {
11 - match smbcloud_networking_account::login::login(env, username, password).await {
12 + match smbcloud_networking_account::login::login(env, SmbClient::Cli, username, password).await {
13 Ok(response) => Ok(serde_wasm_bindgen::to_value(&response)?),
14 Err(error) => Err(serde_wasm_bindgen::to_value(&error)?),
15 }
crates/smbcloud-networking-account-wasm/src/me.rs
+2 -1
@@ -1,10 +1,11 @@
1 use smbcloud_network::environment::Environment;
2 +use smbcloud_networking::smb_client::SmbClient;
3 use wasm_bindgen::JsValue;
4 use wasm_bindgen::prelude::wasm_bindgen;
5
6 #[wasm_bindgen]
7 pub async fn me(env: Environment, access_token: String) -> Result<JsValue, JsValue> {
7 - match smbcloud_networking_account::me::me(env, &access_token).await {
8 + match smbcloud_networking_account::me::me(env, SmbClient::Cli, &access_token).await {
9 Ok(response) => Ok(serde_wasm_bindgen::to_value(&response)?),
10 Err(error) => Err(serde_wasm_bindgen::to_value(&error)?),
11 }
crates/smbcloud-networking-account/src/remove.rs
+5 -4
@@ -2,23 +2,24 @@ use {
2 reqwest::Client,
3 smbcloud_model::error_codes::ErrorResponse,
4 smbcloud_network::{environment::Environment, network::request},
5 - smbcloud_networking::{constants::PATH_USERS, smb_base_url_builder},
5 + smbcloud_networking::{constants::PATH_USERS, smb_base_url_builder, smb_client::SmbClient},
6 };
7
8 pub async fn remove(
9 env: Environment,
10 + client: SmbClient,
11 user_agent: String,
12 access_token: &str,
13 ) -> Result<(), ErrorResponse> {
14 let builder = Client::new()
14 - .delete(build_smb_signup_url(env))
15 + .delete(build_smb_signup_url(env, client))
16 .header("Authorization", access_token)
17 .header("User-agent", user_agent);
18 request(builder).await
19 }
20
20 -fn build_smb_signup_url(env: Environment) -> String {
21 - let mut url_builder = smb_base_url_builder(env);
21 +fn build_smb_signup_url(env: Environment, client: SmbClient) -> String {
22 + let mut url_builder = smb_base_url_builder(env, &client);
23 url_builder.add_route(PATH_USERS);
24 url_builder.build()
25 }