smbcloud_cli/project/
crud_create.rs

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