smbcloud_cli/project/
crud_create.rs

1use crate::{
2    account::{lib::is_logged_in, login::process_login},
3    cli::CommandResult,
4    ui::{fail_message, succeed_message, succeed_symbol},
5};
6use anyhow::{anyhow, Result};
7use console::style;
8use dialoguer::{theme::ColorfulTheme, Input};
9use smbcloud_model::project::ProjectCreate;
10use smbcloud_networking::{environment::Environment, get_smb_token};
11use smbcloud_networking_project::crud_project_create::create_project;
12use spinners::Spinner;
13
14pub async fn process_project_init(env: Environment) -> Result<CommandResult> {
15    if !is_logged_in(env) {
16        let _ = process_login(env).await;
17    }
18
19    let project_name = match Input::<String>::with_theme(&ColorfulTheme::default())
20        .with_prompt("Project name")
21        .interact()
22    {
23        Ok(project_name) => project_name,
24        Err(_) => {
25            return Err(anyhow!(fail_message("Invalid project name.")));
26        }
27    };
28    let repository = match Input::<String>::with_theme(&ColorfulTheme::default())
29        .with_prompt("Project name")
30        .interact()
31    {
32        Ok(project_name) => project_name,
33        Err(_) => {
34            return Err(anyhow!(fail_message("Invalid project name.")));
35        }
36    };
37    let description = match Input::<String>::with_theme(&ColorfulTheme::default())
38        .with_prompt("Description")
39        .interact()
40    {
41        Ok(description) => description,
42        Err(_) => {
43            return Err(anyhow!(fail_message("Invalid description")));
44        }
45    };
46
47    setup_smb_folder(&project_name, &description).await?;
48
49    let spinner = Spinner::new(
50        spinners::Spinners::SimpleDotsScrolling,
51        style("Creating a project...").green().bold().to_string(),
52    );
53
54    let access_token = get_smb_token(env).await?;
55    match create_project(
56        env,
57        access_token,
58        ProjectCreate {
59            name: project_name.clone(),
60            repository,
61            description: description.clone(),
62        },
63    )
64    .await
65    {
66        Ok(_) => Ok(CommandResult {
67            spinner,
68            symbol: succeed_symbol(),
69            msg: succeed_message(&format!("{project_name} has been created.")),
70        }),
71        Err(e) => {
72            println!("Error: {e:#?}");
73            Err(anyhow!(fail_message("Failed to create project.")))
74        }
75    }
76}
77
78async fn setup_smb_folder(name: &str, description: &str) -> Result<()> {
79    // Create .smb folder in the current directory
80    std::fs::create_dir(".smb")?;
81    // Create config.toml file in the .smb folder
82    let repository_name = name.to_lowercase().replace(" ", "");
83    std::fs::write(
84        ".smb/config.toml",
85        format!(
86            r#"
87name = "{name}"
88description = "{description}"
89[repository]
90id = 1
91name = "{repository_name}"
92"#,
93        ),
94    )?;
95    Ok(())
96}