smbcloud_cli/project/
crud_read.rs1use crate::{
2 cli::CommandResult,
3 ui::{fail_message, fail_symbol, succeed_message, succeed_symbol},
4};
5use anyhow::{anyhow, Result};
6use smbcloud_model::project::Project;
7use smbcloud_networking::environment::Environment;
8use smbcloud_networking_project::{get_all, get_project};
9use spinners::Spinner;
10use tabled::{Table, Tabled};
11
12#[derive(Tabled)]
13struct ProjectRow {
14 #[tabled(rename = "ID")]
15 id: i32,
16 #[tabled(rename = "Name")]
17 name: String,
18 #[tabled(rename = "Repository")]
19 repository: String,
20 #[tabled(rename = "Description")]
21 description: String,
22 #[tabled(rename = "Created at")]
23 created_at: String,
24 #[tabled(rename = "Updated at")]
25 updated_at: String,
26}
27
28pub async fn process_project_list(env: Environment) -> Result<CommandResult> {
29 let mut spinner = Spinner::new(
30 spinners::Spinners::SimpleDotsScrolling,
31 succeed_message("Loading"),
32 );
33
34 match get_all(env).await {
35 Ok(projects) => {
36 spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
37 let msg = if projects.is_empty() {
38 succeed_message("No projects found.")
39 } else {
40 succeed_message("Showing all projects.")
41 };
42 show_projects(projects);
43 Ok(CommandResult {
44 spinner: Spinner::new(
45 spinners::Spinners::SimpleDotsScrolling,
46 succeed_message("Loading"),
47 ),
48 symbol: succeed_symbol(),
49 msg,
50 })
51 }
52 Err(e) => {
53 println!("Error: {e:#?}");
54 Ok(CommandResult {
55 spinner,
56 symbol: fail_symbol(),
57 msg: fail_message("Failed to get all projects."),
58 })
59 }
60 }
61}
62
63pub async fn process_project_show(env: Environment, id: String) -> Result<CommandResult> {
64 let mut spinner = Spinner::new(
65 spinners::Spinners::SimpleDotsScrolling,
66 succeed_message("Loading"),
67 );
68 match get_project(env, id).await {
69 Ok(project) => {
70 spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
71 let message = succeed_message(&format!("Showing project {}.", &project.name));
72 show_projects(vec![project]);
73 Ok(CommandResult {
74 spinner: Spinner::new(
75 spinners::Spinners::SimpleDotsScrolling,
76 succeed_message("Loading"),
77 ),
78 symbol: succeed_symbol(),
79 msg: message,
80 })
81 }
82 Err(e) => {
83 spinner.stop_and_persist(&fail_symbol(), fail_message("Failed."));
84 Err(anyhow!("{e}"))
85 }
86 }
87}
88
89pub(crate) fn show_projects(projects: Vec<Project>) {
90 if projects.is_empty() {
91 return;
92 }
93 let rows: Vec<ProjectRow> = projects
94 .into_iter()
95 .map(|p| ProjectRow {
96 id: p.id,
97 name: p.name,
98 repository: p.repository,
99 description: p.description.unwrap_or("-".to_owned()),
100 created_at: p.created_at.date_naive().to_string(),
101 updated_at: p.updated_at.date_naive().to_string(),
102 })
103 .collect();
104 let table = Table::new(rows);
105 println!("{table}");
106}