1 pub mod cli;
2
3 use self::cli::Commands;
4 use anyhow::{anyhow, Result};
5 use console::style;
6 use dialoguer::{theme::ColorfulTheme, Input};
7 use log::debug;
8 use smbpndk_model::{CommandResult, Config, ProjectCreate};
9 use smbpndk_networking_project::{create_project, delete_project, get_all, get_project};
10 use spinners::Spinner;
11 use std::{fs::OpenOptions, io::Write};
12
13 pub async fn process_project(commands: Commands) -> Result<CommandResult> {
14 match commands {
15 Commands::New {} => {
16 let project_name = Input::<String>::with_theme(&ColorfulTheme::default())
17 .with_prompt("Project name")
18 .interact()
19 .unwrap();
20 let description = Input::<String>::with_theme(&ColorfulTheme::default())
21 .with_prompt("Description")
22 .interact()
23 .unwrap();
24
25 let spinner = Spinner::new(
26 spinners::Spinners::SimpleDotsScrolling,
27 style("Creating project...").green().bold().to_string(),
28 );
29
30 match create_project(ProjectCreate {
31 name: project_name.clone(),
32 description: description.clone(),
33 })
34 .await
35 {
36 Ok(_) => Ok(CommandResult {
37 spinner,
38 symbol: "✅".to_owned(),
39 msg: format!("Creating a project {project_name}."),
40 }),
41 Err(e) => {
42 println!("Error: {e:#?}");
43 Ok(CommandResult {
44 spinner,
45 symbol: "😩".to_owned(),
46 msg: format!("Failed to create a project {project_name}."),
47 })
48 }
49 }
50 }
51 Commands::List {} => {
52 let spinner = Spinner::new(
53 spinners::Spinners::SimpleDotsScrolling,
54 style("Loading...").green().bold().to_string(),
55 );
56
57 // Get all
58 match get_all().await {
59 Ok(projects) => {
60 println!("Projects: {projects:#?}");
61 println!(
62 "{0: <5} | {1: <20} | {2: <30} | {3: <30}",
63 "ID", "Name", "Created at", "Updated at"
64 );
65 for project in projects {
66 println!(
67 "{0: <5} | {1: <20} | {2: <30} | {3: <30}",
68 project.id, project.name, project.created_at, project.updated_at
69 );
70 }
71 Ok(CommandResult {
72 spinner,
73 symbol: "✅".to_owned(),
74 msg: "Showing all projects.".to_owned(),
75 })
76 }
77 Err(e) => {
78 println!("Error: {e:#?}");
79 Ok(CommandResult {
80 spinner,
81 symbol: "😩".to_owned(),
82 msg: "Failed to get all projects.".to_owned(),
83 })
84 }
85 }
86 }
87 Commands::Show { id } => {
88 let spinner = Spinner::new(
89 spinners::Spinners::SimpleDotsScrolling,
90 style("Loading...").green().bold().to_string(),
91 );
92 // Get Detail
93 match get_project(id).await {
94 Ok(_) => Ok(CommandResult {
95 spinner,
96 symbol: "✅".to_owned(),
97 msg: "Showing all projects.".to_owned(),
98 }),
99 Err(e) => {
100 println!("Error: {e:#?}");
101 Ok(CommandResult {
102 spinner,
103 symbol: "😩".to_owned(),
104 msg: "Failed to get all projects.".to_owned(),
105 })
106 }
107 }
108 }
109 Commands::Delete { id } => {
110 let spinner = Spinner::new(
111 spinners::Spinners::SimpleDotsScrolling,
112 style("Deleting project...").green().bold().to_string(),
113 );
114 match delete_project(id).await {
115 Ok(_) => Ok(CommandResult {
116 spinner,
117 symbol: "✅".to_owned(),
118 msg: "Project deleted.".to_string(),
119 }),
120 Err(e) => {
121 let error = anyhow!("Failed to delete project. {e}");
122 Err(error)
123 }
124 }
125 }
126 Commands::Use { id } => {
127 let project = get_project(id).await?;
128
129 let config = Config {
130 current_project: Some(project),
131 current_auth_app: None,
132 };
133
134 let spinner = Spinner::new(
135 spinners::Spinners::SimpleDotsScrolling,
136 style("Loading...").green().bold().to_string(),
137 );
138 match home::home_dir() {
139 Some(path) => {
140 debug!("{}", path.to_str().unwrap());
141 let mut file = OpenOptions::new()
142 .create(true)
143 .write(true)
144 .open([path.to_str().unwrap(), "/.smb/config.json"].join(""))?;
145 let json = serde_json::to_string(&config)?;
146 file.write_all(json.as_bytes())?;
147
148 Ok(CommandResult {
149 spinner,
150 symbol: "✅".to_owned(),
151 msg: "Use project successful.".to_string(),
152 })
153 }
154 None => {
155 let error = anyhow!("Failed to get home directory.");
156 Err(error)
157 }
158 }
159 }
160 }
161 }