smbcloud_cli/project/
crud_read.rs

1use 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}