smbcloud_cli/project/
init.rs

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