5 files changed
+33
-2
crates/cli/src/deploy/setup_create_new_project.rs
+11
-1
@@ -1,10 +1,11 @@
1
use {
2
crate::token::get_smb_token::get_smb_token,
3
- dialoguer::{theme::ColorfulTheme, Input},
3
+ dialoguer::{console::Term, theme::ColorfulTheme, Input, Select},
4
regex::Regex,
5
smbcloud_model::{
6
error_codes::{ErrorCode, ErrorResponse},
7
project::{Project, ProjectCreate},
8
+ runner::Runner,
9
},
10
smbcloud_network::environment::Environment,
11
smbcloud_networking_project::crud_project_create::create_project,
@@ -73,6 +74,14 @@ pub(crate) async fn create_new_project(
74
}
75
};
76
77
+ let runners = vec![Runner::NodeJs, Runner::Swift, Runner::Ruby];
78
+ let runner = Select::with_theme(&ColorfulTheme::default())
79
+ .items(&runners)
80
+ .default(0)
81
+ .interact_on_opt(&Term::stderr())
82
+ .map(|i| runners[i.unwrap()])
83
+ .unwrap();
84
+
85
let access_token = match get_smb_token(env) {
86
Ok(token) => token,
87
Err(_) => {
@@ -88,6 +97,7 @@ pub(crate) async fn create_new_project(
97
access_token,
98
ProjectCreate {
99
name,
100
+ runner,
101
repository,
102
description,
103
},
crates/cli/src/project/crud_create.rs
+13
@@ -7,8 +7,11 @@ use crate::{
7
use anyhow::{anyhow, Result};
8
use chrono::Utc;
9
use console::style;
10
+use dialoguer::console::Term;
11
+use dialoguer::Select;
12
use dialoguer::{theme::ColorfulTheme, Input};
13
use smbcloud_model::project::ProjectCreate;
14
+use smbcloud_model::runner::Runner;
15
use smbcloud_network::environment::Environment;
16
use smbcloud_networking_project::crud_project_create::create_project;
17
use spinners::Spinner;
@@ -31,6 +34,15 @@ pub async fn process_project_init(
34
return Err(anyhow!(fail_message("Invalid project name.")));
35
}
36
};
37
+
38
+ let runners = vec![Runner::NodeJs, Runner::Swift, Runner::Ruby];
39
+ let runner = Select::with_theme(&ColorfulTheme::default())
40
+ .items(&runners)
41
+ .default(0)
42
+ .interact_on_opt(&Term::stderr())
43
+ .map(|i| runners[i.unwrap()])
44
+ .unwrap();
45
+
46
let repository = match Input::<String>::with_theme(&ColorfulTheme::default())
47
.with_prompt("Repository name")
48
.interact()
@@ -65,6 +77,7 @@ pub async fn process_project_init(
77
access_token,
78
ProjectCreate {
79
name: project_name.clone(),
80
+ runner,
81
repository,
82
description: description.clone(),
83
},
crates/cli/src/project/crud_read.rs
+3
@@ -19,6 +19,8 @@ struct ProjectRow {
19
id: i32,
20
#[tabled(rename = "Name")]
21
name: String,
22
+ #[tabled(rename = "Runner")]
23
+ runner: String,
24
#[tabled(rename = "Repository")]
25
repository: String,
26
#[tabled(rename = "Description")]
@@ -112,6 +114,7 @@ pub(crate) fn show_projects(projects: Vec<Project>) {
114
.map(|p| ProjectRow {
115
id: p.id,
116
name: p.name,
117
+ runner: p.runner.to_string(),
118
repository: p.repository.unwrap_or("-".to_string()),
119
description: p.description.unwrap_or("-".to_owned()),
120
})
crates/smbcloud-model/src/project.rs
+3
@@ -36,6 +36,7 @@ pub struct ProjectCreate {
36
pub name: String,
37
pub repository: String,
38
pub description: String,
39
+ pub runner: Runner,
40
}
41
42
#[derive(Deserialize, Serialize, Debug)]
@@ -86,11 +87,13 @@ mod tests {
87
name: "test".to_owned(),
88
repository: "test".to_owned(),
89
description: "test".to_owned(),
90
+ runner: Runner::NodeJs,
91
};
92
let json = json!({
93
"name": "test",
94
"repository": "test", // Corrected: repository should be included as per struct
95
"description": "test",
96
+ "runner": 0
97
});
98
assert_eq!(serde_json::to_value(project_create).unwrap(), json);
99
}
crates/smbcloud-model/src/runner.rs
+3
-1
@@ -1,6 +1,7 @@
1
use {
2
crate::error_codes::{ErrorCode::UnsupportedRunner, ErrorResponse},
3
serde::{Deserialize, Serialize},
4
+ serde_repr::{Deserialize_repr, Serialize_repr},
5
std::{
6
fmt::{self, Display, Formatter},
7
fs,
@@ -8,7 +9,8 @@ use {
9
},
10
};
11
11
-#[derive(Debug, Serialize, Deserialize, Clone)]
12
+#[derive(Debug, Deserialize_repr, Serialize_repr, Clone, Copy)]
13
+#[repr(u8)]
14
#[tsync::tsync]
15
pub enum Runner {
16
NodeJs,