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