@smbcloud / cli / commits / 4712797

update project description

Seto Elkahfi committed Jun 6, 2025 at 18:44 UTC 4712797c5d483f570cdba434ad9b9855152f7d6c
11 files changed +123 -37
Cargo.lock
+10 -10
@@ -1582,9 +1582,9 @@ dependencies = [
1582
1583 [[package]]
1584 name = "serde_spanned"
1585 -version = "0.6.8"
1585 +version = "0.6.9"
1586 source = "registry+https://github.com/rust-lang/crates.io-index"
1587 -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
1587 +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
1588 dependencies = [
1589 "serde",
1590 ]
@@ -2092,9 +2092,9 @@ dependencies = [
2092
2093 [[package]]
2094 name = "toml"
2095 -version = "0.8.22"
2095 +version = "0.8.23"
2096 source = "registry+https://github.com/rust-lang/crates.io-index"
2097 -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae"
2097 +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
2098 dependencies = [
2099 "serde",
2100 "serde_spanned",
@@ -2104,18 +2104,18 @@ dependencies = [
2104
2105 [[package]]
2106 name = "toml_datetime"
2107 -version = "0.6.9"
2107 +version = "0.6.11"
2108 source = "registry+https://github.com/rust-lang/crates.io-index"
2109 -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3"
2109 +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
2110 dependencies = [
2111 "serde",
2112 ]
2113
2114 [[package]]
2115 name = "toml_edit"
2116 -version = "0.22.26"
2116 +version = "0.22.27"
2117 source = "registry+https://github.com/rust-lang/crates.io-index"
2118 -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
2118 +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
2119 dependencies = [
2120 "indexmap",
2121 "serde",
@@ -2127,9 +2127,9 @@ dependencies = [
2127
2128 [[package]]
2129 name = "toml_write"
2130 -version = "0.1.1"
2130 +version = "0.1.2"
2131 source = "registry+https://github.com/rust-lang/crates.io-index"
2132 -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076"
2132 +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
2133
2134 [[package]]
2135 name = "tower"
Cargo.toml
+1 -1
@@ -14,7 +14,7 @@ async-trait = "0.1.51"
14 chrono = "0.4"
15 clap = "4.1.6"
16 clap_mangen = "0.2.10"
17 -console = "0.15.0"
17 +console = "0.15"
18 dialoguer = "0.11.0"
19 dirs = "6.0"
20 git2 = "0.20.1"
crates/cli/src/deploy/setup.rs
+5 -1
@@ -109,7 +109,11 @@ async fn create_new_project(env: Environment, path: &str) -> Result<Project, Con
109
110 // Create a repository name: lowercased, remove spaces and special characters
111 let re = Regex::new(r"[^a-zA-Z0-9_-]").unwrap();
112 - let default_repository = name.clone().to_lowercase().replace(' ', "_").replace('-', "");
112 + let default_repository = name
113 + .clone()
114 + .to_lowercase()
115 + .replace(' ', "_")
116 + .replace('-', "");
117 let default_repo = re.replace_all(&default_repository, "");
118
119 let repository = match Input::<String>::with_theme(&ColorfulTheme::default())
crates/cli/src/main.rs
+1 -1
@@ -6,11 +6,11 @@ use smbcloud_cli::account::logout::process_logout;
6 use smbcloud_cli::account::me::process_me;
7 use smbcloud_cli::cli::CommandResult;
8 use smbcloud_cli::project::crud_create::process_project_init;
9 +use smbcloud_cli::project::process::process_project;
10 use smbcloud_cli::{
11 account::process_account,
12 cli::{Cli, Commands},
13 deploy::process_deploy,
13 - project::process_project,
14 };
15 use smbcloud_networking::environment::Environment;
16 use std::{
crates/cli/src/project/cli.rs
+5
@@ -32,4 +32,9 @@ pub enum Commands {
32 #[clap(short, long)]
33 id: Option<String>,
34 },
35 + #[clap(about = "Update project description. Specify `--id` to update specific project.")]
36 + Update {
37 + #[clap(short, long)]
38 + id: String,
39 + },
40 }
crates/cli/src/project/crud_update.rs new
+49
@@ -0,0 +1,49 @@
1 +use anyhow::{anyhow, Result};
2 +use dialoguer::{theme::ColorfulTheme, Input};
3 +use smbcloud_networking::{environment::Environment, get_smb_token};
4 +use smbcloud_networking_project::{
5 + crud_project_read::get_project, crud_project_update::update_project_description,
6 +};
7 +use spinners::Spinner;
8 +
9 +use crate::{
10 + account::{lib::is_logged_in, login::process_login},
11 + cli::CommandResult,
12 + ui::{description, succeed_message, succeed_symbol},
13 +};
14 +
15 +pub async fn process_project_update_description(
16 + env: Environment,
17 + project_id: String,
18 +) -> Result<CommandResult> {
19 + // Check credentials.
20 + if !is_logged_in(env) {
21 + let _ = process_login(env).await;
22 + }
23 +
24 + let access_token = get_smb_token(env).await?;
25 + let project = get_project(env, access_token.clone(), project_id.clone()).await?;
26 +
27 + if let Some(project_description) = project.description {
28 + println!("Description: {}", description(&project_description));
29 + }
30 +
31 + // Prompt for new description
32 + let new_description = match Input::<String>::with_theme(&ColorfulTheme::default())
33 + .with_prompt("New description")
34 + .interact()
35 + {
36 + Ok(desc) => desc,
37 + Err(_) => return Err(anyhow!("Invalid description.")),
38 + };
39 + let spinner = Spinner::new(
40 + spinners::Spinners::SimpleDotsScrolling,
41 + succeed_message("Loading"),
42 + );
43 + update_project_description(env, access_token, project_id, &new_description).await?;
44 + Ok(CommandResult {
45 + spinner,
46 + symbol: succeed_symbol(),
47 + msg: succeed_message("Updated."),
48 + })
49 +}
crates/cli/src/project/mod.rs
+2 -24
@@ -2,28 +2,6 @@ pub mod cli;
2 pub mod crud_create;
3 pub mod crud_delete;
4 pub mod crud_read;
5 +pub mod crud_update;
6 mod deployment;
6 -
7 -use self::cli::Commands;
8 -use crate::{
9 - cli::CommandResult,
10 - project::{
11 - crud_create::process_project_init,
12 - crud_delete::process_project_delete,
13 - crud_read::{process_project_list, process_project_show, process_project_use},
14 - deployment::process_deployment,
15 - },
16 -};
17 -use anyhow::Result;
18 -use smbcloud_networking::environment::Environment;
19 -
20 -pub async fn process_project(env: Environment, commands: Commands) -> Result<CommandResult> {
21 - match commands {
22 - Commands::New {} => process_project_init(env).await,
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,
27 - Commands::Deployment { id } => process_deployment(env, id).await,
28 - }
29 -}
7 +pub mod process;
crates/cli/src/project/process.rs new
+25
@@ -0,0 +1,25 @@
1 +use crate::{
2 + cli::CommandResult,
3 + project::{
4 + cli::Commands,
5 + crud_create::process_project_init,
6 + crud_delete::process_project_delete,
7 + crud_read::{process_project_list, process_project_show, process_project_use},
8 + crud_update::process_project_update_description,
9 + deployment::process_deployment,
10 + },
11 +};
12 +use anyhow::Result;
13 +use smbcloud_networking::environment::Environment;
14 +
15 +pub async fn process_project(env: Environment, commands: Commands) -> Result<CommandResult> {
16 + match commands {
17 + Commands::New {} => process_project_init(env).await,
18 + Commands::List {} => process_project_list(env).await,
19 + Commands::Show { id } => process_project_show(env, id).await,
20 + Commands::Delete { id } => process_project_delete(env, id).await,
21 + Commands::Use { id } => process_project_use(env, id).await,
22 + Commands::Deployment { id } => process_deployment(env, id).await,
23 + Commands::Update { id } => process_project_update_description(env, id).await,
24 + }
25 +}
crates/cli/src/ui/mod.rs
+4
@@ -19,3 +19,7 @@ pub fn fail_message(message: &str) -> String {
19 pub fn highlight(string: &str) -> String {
20 style(string).italic().green().to_string()
21 }
22 +
23 +pub fn description(string: &str) -> String {
24 + style(string).italic().yellow().to_string()
25 +}
crates/smbcloud-networking-project/src/crud_project_update.rs new
+20
@@ -0,0 +1,20 @@
1 +use crate::url_builder::build_project_url_with_id;
2 +use reqwest::Client;
3 +use smbcloud_model::{error_codes::ErrorResponse, project::Project};
4 +use smbcloud_networking::{constants::SMB_USER_AGENT, environment::Environment, network::request};
5 +
6 +pub async fn update_project_description(
7 + env: Environment,
8 + access_token: String,
9 + project_id: String,
10 + new_description: &str,
11 +) -> Result<Project, ErrorResponse> {
12 + // PATCH is correct for partial update of description
13 + let url = build_project_url_with_id(env, project_id.to_string());
14 + let builder = Client::new()
15 + .patch(url)
16 + .header("Authorization", access_token)
17 + .header("User-agent", SMB_USER_AGENT)
18 + .json(&serde_json::json!({ "description": new_description }));
19 + request(builder).await
20 +}
crates/smbcloud-networking-project/src/lib.rs
+1
@@ -4,4 +4,5 @@ pub mod crud_project_deployment_create;
4 pub mod crud_project_deployment_read;
5 pub mod crud_project_deployment_update;
6 pub mod crud_project_read;
7 +pub mod crud_project_update;
8 mod url_builder;