@smbcloud / cli / commits / ffcac72

add error code

Seto Elkahfi committed May 31, 2025 at 18:29 UTC ffcac72621a6b785496b89aad0c32f2da7211579
3 files changed +33 -34
crates/cli/src/project/crud_delete.rs
+9 -5
@@ -1,14 +1,17 @@
1 use crate::{
2 - cli::CommandResult,
3 - ui::{fail_message, fail_symbol, succeed_message, succeed_symbol},
2 + account::lib::is_logged_in, cli::CommandResult, ui::{fail_message, fail_symbol, succeed_message, succeed_symbol}
3 };
5 -use anyhow::Result;
4 +use anyhow::{anyhow, Result};
5 use dialoguer::{theme::ColorfulTheme, Input};
7 -use smbcloud_networking::environment::Environment;
6 +use smbcloud_networking::{environment::Environment, get_smb_token};
7 use smbcloud_networking_project::delete_project;
8 use spinners::Spinner;
9
10 pub async fn process_project_delete(env: Environment, id: String) -> Result<CommandResult> {
11 + if !is_logged_in(env) {
12 + return Err(anyhow!(fail_message("Please log in with `smb init`.")));
13 + }
14 +
15 let confirmation = Input::<String>::with_theme(&ColorfulTheme::default())
16 .with_prompt("Are you sure you want to delete this project? (y/n)")
17 .interact()
@@ -26,7 +29,8 @@ pub async fn process_project_delete(env: Environment, id: String) -> Result<Comm
29 msg: succeed_message("Cancelled."),
30 });
31 }
29 - match delete_project(env, id).await {
32 + let access_token = get_smb_token(env).await?;
33 + match delete_project(env, access_token, id).await {
34 Ok(_) => Ok(CommandResult {
35 spinner,
36 symbol: succeed_symbol(),
crates/smbcloud-model/src/error_codes.rs
+8 -8
@@ -1,15 +1,11 @@
1 use core::fmt;
2 -use std::{
3 - error::Error,
4 - fmt::{Display, Formatter},
5 -};
6 -
2 +use std::fmt::{Display, Formatter};
3 use serde::{Deserialize, Serialize};
4 use serde_repr::{Deserialize_repr, Serialize_repr};
5 use strum_macros::EnumIter;
6 use thiserror::Error;
7
12 -#[derive(Serialize, Deserialize, Debug)]
8 +#[derive(Error, Serialize, Deserialize, Debug)]
9 #[serde(untagged)]
10 pub enum ErrorResponse {
11 Error {
@@ -18,8 +14,6 @@ pub enum ErrorResponse {
14 },
15 }
16
21 -impl Error for ErrorResponse {}
22 -
17 impl Display for ErrorResponse {
18 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
19 write!(f, "{:?}", self)
@@ -35,6 +29,9 @@ pub enum ErrorCode {
29 ParseError = 1,
30 #[error("Network error.")]
31 NetworkError = 2,
32 + // Account
33 + #[error("Unauthorized access.")]
34 + Unauthorized = 100,
35 // Projects
36 #[error("Project not found.")]
37 ProjectNotFound = 1000,
@@ -45,6 +42,8 @@ impl ErrorCode {
42 /// so we need to get it from i32.
43 pub fn from_i32(value: i32) -> Self {
44 match value {
45 + // Account
46 + 100 => ErrorCode::Unauthorized,
47 // Projects
48 1000 => ErrorCode::ProjectNotFound,
49 // Fallback
@@ -62,6 +61,7 @@ impl ErrorCode {
61 ErrorCode::ProjectNotFound => "Project not found.",
62 ErrorCode::ParseError => "Parse error.",
63 ErrorCode::NetworkError => "Network error.",
64 + ErrorCode::Unauthorized => "Unauthorized access."
65 }
66 }
67
crates/smbcloud-networking-project/src/lib.rs
+16 -21
@@ -5,10 +5,14 @@ pub mod crud_project_deployment_update;
5 pub mod crud_project_read;
6
7 use anyhow::{anyhow, Result};
8 -use log::debug;
9 -use reqwest::{Client, StatusCode};
10 -use smbcloud_model::project::{Project, ProjectCreate};
11 -use smbcloud_networking::{environment::Environment, get_smb_token, smb_base_url_builder};
8 +use reqwest::Client;
9 +use smbcloud_model::{
10 + error_codes::ErrorResponse,
11 + project::{Project, ProjectCreate},
12 +};
13 +use smbcloud_networking::{
14 + environment::Environment, get_smb_token, network::request, smb_base_url_builder,
15 +};
16
17 pub async fn create_project(env: Environment, project: ProjectCreate) -> Result<Project> {
18 // Get current token
@@ -31,24 +35,15 @@ pub async fn create_project(env: Environment, project: ProjectCreate) -> Result<
35 }
36 }
37
34 -pub async fn delete_project(env: Environment, id: String) -> Result<()> {
35 - // Get current token
36 - let token = get_smb_token(env).await?;
37 -
38 - let response = Client::new()
38 +pub async fn delete_project(
39 + env: Environment,
40 + access_token: String,
41 + id: String,
42 +) -> Result<(), ErrorResponse> {
43 + let builder = Client::new()
44 .delete(build_project_url_with_id(env, id))
40 - .header("Authorization", token)
41 - .send()
42 - .await?;
43 -
44 - match response.status() {
45 - StatusCode::OK => {
46 - debug!("Project deleted.");
47 - Ok(())
48 - }
49 - StatusCode::NOT_FOUND => Err(anyhow!("Failed to delete a project: project not found.")),
50 - _ => Err(anyhow!("Failed to delete a project: unknown error.")),
51 - }
45 + .header("Authorization", access_token);
46 + request(builder).await
47 }
48
49 // Private functions