2 files changed
+32
-66
crates/cli/src/project/crud_read.rs
+28
-2
@@ -2,10 +2,10 @@ use crate::{
2
cli::CommandResult,
3
ui::{fail_message, fail_symbol, succeed_message, succeed_symbol},
4
};
5
-use anyhow::Result;
5
+use anyhow::{anyhow, Result};
6
use smbcloud_model::project::Project;
7
use smbcloud_networking::environment::Environment;
8
-use smbcloud_networking_project::get_all;
8
+use smbcloud_networking_project::{get_all, get_project};
9
use spinners::Spinner;
10
use tabled::{Table, Tabled};
11
@@ -58,6 +58,32 @@ pub async fn process_project_list(env: Environment) -> Result<CommandResult> {
58
}
59
}
60
61
+pub async fn process_project_show(env: Environment, id: String) -> Result<CommandResult> {
62
+ let mut spinner = Spinner::new(
63
+ spinners::Spinners::SimpleDotsScrolling,
64
+ succeed_message("Loading"),
65
+ );
66
+ match get_project(env, id).await {
67
+ Ok(project) => {
68
+ spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
69
+ let message = succeed_message(&format!("Showing project {}.", &project.name));
70
+ show_projects(vec![project]);
71
+ Ok(CommandResult {
72
+ spinner: Spinner::new(
73
+ spinners::Spinners::SimpleDotsScrolling,
74
+ succeed_message("Loading"),
75
+ ),
76
+ symbol: succeed_symbol(),
77
+ msg: message,
78
+ })
79
+ }
80
+ Err(e) => {
81
+ spinner.stop_and_persist(&fail_symbol(), fail_message("Failed."));
82
+ Err(anyhow!("{e}"))
83
+ }
84
+ }
85
+}
86
+
87
pub(crate) fn show_projects(projects: Vec<Project>) {
88
if projects.is_empty() {
89
return;
crates/cli/src/project/mod.rs
+4
-64
@@ -8,63 +8,23 @@ use crate::{
8
cli::CommandResult,
9
project::crud_create::process_project_init,
10
project::crud_delete::process_project_delete,
11
- project::crud_read::process_project_list,
12
- ui::{fail_message, fail_symbol, succeed_message, succeed_symbol},
11
+ project::crud_read::{process_project_list, process_project_show},
12
+ ui::{succeed_message, succeed_symbol},
13
};
14
use anyhow::{anyhow, Result};
15
use log::debug;
16
-use smbcloud_model::project::{Config, Project};
16
+use smbcloud_model::project::Config;
17
use smbcloud_networking::environment::Environment;
18
use smbcloud_networking_project::get_project;
19
use spinners::Spinner;
20
use std::{fs::OpenOptions, io::Write};
21
-use tabled::{Table, Tabled};
22
-
23
-#[derive(Tabled)]
24
-struct ProjectRow {
25
- #[tabled(rename = "ID")]
26
- id: i32,
27
- #[tabled(rename = "Name")]
28
- name: String,
29
- #[tabled(rename = "Description")]
30
- description: String,
31
- #[tabled(rename = "Created at")]
32
- created_at: String,
33
- #[tabled(rename = "Updated at")]
34
- updated_at: String,
35
-}
21
22
pub async fn process_project(env: Environment, commands: Commands) -> Result<CommandResult> {
23
match commands {
24
Commands::New {} => process_project_init(env).await,
25
Commands::List {} => process_project_list(env).await,
26
+ Commands::Show { id } => process_project_show(env, id).await,
27
Commands::Delete { id } => process_project_delete(env, id).await,
42
- Commands::Show { id } => {
43
- let mut spinner = Spinner::new(
44
- spinners::Spinners::SimpleDotsScrolling,
45
- succeed_message("Loading"),
46
- );
47
- // Get Detail
48
- match get_project(env, id).await {
49
- Ok(project) => {
50
- spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
51
- let message = succeed_message(&format!("Showing project {}.", &project.name));
52
- show_projects(vec![project]);
53
- Ok(CommandResult {
54
- spinner: Spinner::new(
55
- spinners::Spinners::SimpleDotsScrolling,
56
- succeed_message("Loading"),
57
- ),
58
- symbol: succeed_symbol(),
59
- msg: message,
60
- })
61
- }
62
- Err(e) => {
63
- spinner.stop_and_persist(&fail_symbol(), fail_message("Failed."));
64
- Err(anyhow!("{e}"))
65
- }
66
- }
67
- }
28
Commands::Use { id } => {
29
let project = get_project(env, id).await?;
30
@@ -102,23 +62,3 @@ pub async fn process_project(env: Environment, commands: Commands) -> Result<Com
62
}
63
}
64
}
105
-
106
-// Private functions
107
-
108
-fn show_projects(projects: Vec<Project>) {
109
- if projects.is_empty() {
110
- return;
111
- }
112
- let rows: Vec<ProjectRow> = projects
113
- .into_iter()
114
- .map(|p| ProjectRow {
115
- id: p.id,
116
- name: p.name,
117
- description: p.description,
118
- created_at: p.created_at.date_naive().to_string(),
119
- updated_at: p.updated_at.date_naive().to_string(),
120
- })
121
- .collect();
122
- let table = Table::new(rows);
123
- println!("{table}");
124
-}