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 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 std::fs::create_dir(".smb")?;
82 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}