smbcloud_cli/project/
crud_create.rs1use 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 std::fs::create_dir(".smb")?;
81 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}