10 files changed
+43
-54
Cargo.toml
+2
-2
@@ -33,6 +33,8 @@ smbcloud-networking = { version = "0.3", path = "crates/smbcloud-networking" }
33
smbcloud-networking-project = { version = "0.3.0", path = "crates/smbcloud-networking-project" }
34
smbcloud-utils = { version = "0.3.0", path = "crates/smbcloud-utils" }
35
spinners = "4.1.0"
36
+strum = "0.27"
37
+strum_macros = "0.27"
38
tabled = "0.19"
39
thiserror = "2.0"
40
tokio = "1.44"
@@ -42,5 +44,3 @@ tracing-bunyan-formatter = "0.3.3"
44
tracing-subscriber = "0.3.14"
45
url = "2"
46
url-builder = "0.1.1"
45
-strum = "0.27"
46
-strum_macros = "0.27"
crates/cli/src/deploy/config.rs
+4
-6
@@ -55,14 +55,14 @@ fn handle_config_error() -> Result<Config, ConfigError> {
55
56
pub(crate) async fn check_project(
57
env: Environment,
58
- access_token: String,
59
- id: i32
58
+ access_token: &str,
59
+ id: i32,
60
) -> Result<(), ConfigError> {
61
let mut spinner: Spinner = Spinner::new(
62
spinners::Spinners::Hamburger,
63
succeed_message("Validate project"),
64
);
65
- match get_project(env, access_token, id.to_string()).await {
65
+ match get_project(env, access_token.to_string(), id.to_string()).await {
66
Ok(_) => {
67
spinner.stop_and_persist(&succeed_symbol(), succeed_message("Valid project"));
68
Ok(())
@@ -94,9 +94,7 @@ impl Config {
94
fn ssh_key_path(&self, user_id: i32) -> String {
95
// Use the dirs crate to get the home directory
96
let home = dirs::home_dir().expect("Could not determine home directory");
97
- let key_path = home
98
- .join(".ssh")
99
- .join(format!("id_{}@smbcloud", user_id));
97
+ let key_path = home.join(".ssh").join(format!("id_{}@smbcloud", user_id));
98
let key_path_str = key_path.to_string_lossy().to_string();
99
println!("Use key path: {}", key_path_str);
100
key_path_str
crates/cli/src/deploy/mod.rs
+1
-1
@@ -33,7 +33,7 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
33
let config = check_config(env).await?;
34
35
// Validate config with project.
36
- check_project(env, access_token, config.project.id).await?;
36
+ check_project(env, &access_token, config.project.id).await?;
37
38
// Check remote repository setup.
39
let repo = match Repository::open(".") {
crates/cli/src/project/deployment.rs
+5
-6
@@ -6,9 +6,7 @@ use crate::{
6
use anyhow::Result;
7
use smbcloud_model::project::Deployment;
8
use smbcloud_networking::{environment::Environment, get_smb_token};
9
-use smbcloud_networking_project::crud_project_deployment_read::{
10
- get_deployment_detail, list_deployments,
11
-};
9
+use smbcloud_networking_project::crud_project_deployment_read::{get_deployment, get_deployments};
10
use spinners::Spinner;
11
use tabled::{Table, Tabled};
12
@@ -23,18 +21,19 @@ pub(crate) async fn process_deployment(
21
22
let access_token = get_smb_token(env).await?;
23
26
- check_project(env,access_token, config.project.id).await?;
24
+ check_project(env, &access_token, config.project.id).await?;
25
26
if let Some(deployment_id) = id {
27
// Show detail for a specific deployment
28
let deployment_id: i32 = deployment_id.parse()?;
31
- let deployment = get_deployment_detail(env, config.project.id, deployment_id).await?;
29
+ let deployment =
30
+ get_deployment(env, access_token, config.project.id, deployment_id).await?;
31
spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded"));
32
show_deployment_detail(&deployment);
33
} else {
34
// List all deployments for the project
35
let access_token = get_smb_token(env).await?;
37
- let deployments = list_deployments(env, access_token, config.project.id).await?;
36
+ let deployments = get_deployments(env, access_token, config.project.id).await?;
37
spinner.stop_and_persist(&succeed_symbol(), succeed_message("Load all deployments"));
38
show_project_deployments(&deployments);
39
};
crates/cli/src/project/mod.rs
+1
-1
@@ -23,7 +23,7 @@ pub async fn process_project(env: Environment, commands: Commands) -> Result<Com
23
Commands::List {} => process_project_list(env).await,
24
Commands::Show { id } => process_project_show(env, id).await,
25
Commands::Delete { id } => process_project_delete(env, id).await,
26
- Commands::Use { id } => { process_project_use(env, id).await }
26
+ Commands::Use { id } => process_project_use(env, id).await,
27
Commands::Deployment { id } => process_deployment(env, id).await,
28
}
29
}
crates/smbcloud-model/src/error_codes.rs
+5
-5
@@ -31,13 +31,13 @@ impl Display for ErrorResponse {
31
pub enum ErrorCode {
32
#[error("Unknown error.")]
33
Unknown = 0,
34
- #[error("Parse error.")]
34
+ #[error("Parse error.")]
35
ParseError = 1,
36
- #[error("Network error.")]
36
+ #[error("Network error.")]
37
NetworkError = 2,
38
// Projects
39
- #[error("Project not found.")]
40
- ProjectNotFound = 1000
39
+ #[error("Project not found.")]
40
+ ProjectNotFound = 1000,
41
}
42
43
impl ErrorCode {
@@ -64,7 +64,7 @@ impl ErrorCode {
64
ErrorCode::NetworkError => "Network error.",
65
}
66
}
67
-
67
+
68
pub fn rb_constant_name(&self) -> String {
69
self.to_string()
70
}
crates/smbcloud-model/src/lib.rs
+1
-1
@@ -1,10 +1,10 @@
1
pub mod account;
2
pub mod app_auth;
3
+pub mod error_codes;
4
pub mod forgot;
5
pub mod login;
6
pub mod project;
7
pub mod signup;
7
-pub mod error_codes;
8
9
pub mod ar_date_format {
10
use chrono::{DateTime, Utc};
crates/smbcloud-networking-project/src/crud_project_deployment_read.rs
+22
-28
@@ -1,55 +1,49 @@
1
use crate::{build_project_deployment, build_project_deployment_index, build_project_url_with_id};
2
-use anyhow::{anyhow, Result};
2
+use anyhow::Result;
3
use reqwest::Client;
4
-use smbcloud_model::{error_codes::ErrorResponse, project::{Deployment, Project}};
5
-use smbcloud_networking::{constants::SMB_USER_AGENT, environment::Environment, get_smb_token, network::request};
4
+use smbcloud_model::{
5
+ error_codes::ErrorResponse,
6
+ project::{Deployment, Project},
7
+};
8
+use smbcloud_networking::{constants::SMB_USER_AGENT, environment::Environment, network::request};
9
7
-pub async fn list_deployments(
10
+pub async fn get_deployments(
11
env: Environment,
12
access_token: String,
10
- project_id: i32
13
+ project_id: i32,
14
) -> Result<Vec<Deployment>, ErrorResponse> {
15
let builder = Client::new()
16
.get(build_project_deployment_index(env, project_id.to_string()))
17
.header("Authorization", access_token)
18
.header("User-agent", SMB_USER_AGENT);
16
-
19
request(builder).await
20
}
21
20
-pub async fn get_deployment_detail(
22
+pub async fn get_deployment(
23
env: Environment,
24
+ access_token: String,
25
project_id: i32,
26
deployment_id: i32,
24
-) -> Result<Deployment> {
25
- let token = get_smb_token(env).await?;
26
-
27
- let url = build_project_deployment(env, project_id.to_string(), deployment_id.to_string());
28
-
29
- let response = Client::new()
30
- .get(url)
31
- .header("Authorization", token)
32
- .header("User-agent", "smbcloud-cli")
33
- .send()
34
- .await?;
35
-
36
- match response.status() {
37
- reqwest::StatusCode::OK => {
38
- let deployment: Deployment = response.json().await?;
39
- Ok(deployment)
40
- }
41
- _ => Err(anyhow!("Failed to get deployment detail.")),
42
- }
27
+) -> Result<Deployment, ErrorResponse> {
28
+ let builder = Client::new()
29
+ .get(build_project_deployment(
30
+ env,
31
+ project_id.to_string(),
32
+ deployment_id.to_string(),
33
+ ))
34
+ .header("Authorization", access_token)
35
+ .header("User-agent", SMB_USER_AGENT);
36
+ request(builder).await
37
}
38
39
pub async fn get_project(
40
env: Environment,
41
access_token: String,
48
- id: String
42
+ id: String,
43
) -> Result<Project, ErrorResponse> {
44
let builder: reqwest::RequestBuilder = Client::new()
45
.get(build_project_url_with_id(env, id))
46
.header("Authorization", access_token)
47
.header("User-agent", SMB_USER_AGENT);
48
request(builder).await
55
-}
\ No newline at end of file
49
+}
crates/smbcloud-networking-project/src/lib.rs
+1
-3
@@ -4,9 +4,7 @@ pub mod crud_project_deployment_read;
4
use anyhow::{anyhow, Result};
5
use log::debug;
6
use reqwest::{Client, StatusCode};
7
-use smbcloud_model::
8
- project::{Project, ProjectCreate}
9
-;
7
+use smbcloud_model::project::{Project, ProjectCreate};
8
use smbcloud_networking::{environment::Environment, get_smb_token, smb_base_url_builder};
9
10
pub async fn get_all(env: Environment) -> Result<Vec<Project>> {
crates/smbcloud-networking/src/network.rs
+1
-1
@@ -38,7 +38,7 @@ pub async fn parse_error_response<T: DeserializeOwned>(
38
}
39
};
40
error!("Error response: {:?}", e);
41
- return Err(e);
41
+ Err(e)
42
}
43
44
pub async fn request<R: DeserializeOwned>(builder: RequestBuilder) -> Result<R, ErrorResponse> {