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;