Skip to content
This repository was archived by the owner on Sep 9, 2025. It is now read-only.

Commit a0ec894

Browse files
author
Hendrik van Antwerpen
committed
Improve init interaction
1 parent b7c2a0d commit a0ec894

File tree

1 file changed

+57
-44
lines changed
  • tree-sitter-stack-graphs/src/cli

1 file changed

+57
-44
lines changed

tree-sitter-stack-graphs/src/cli/init.rs

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use anyhow::anyhow;
99
use clap::Args;
1010
use clap::ValueHint;
11-
use dialoguer::Confirm;
11+
use dialoguer::Select;
1212
use dialoguer::{Input, Validator};
1313
use indoc::printdoc;
1414
use indoc::writedoc;
@@ -43,49 +43,34 @@ impl InitArgs {
4343

4444
pub fn run(&self) -> anyhow::Result<()> {
4545
self.check_project_dir()?;
46-
let config = ProjectSettings::read_from_console()?;
47-
48-
printdoc! {r##"
49-
Review project settings:
50-
51-
Project directory : {}
52-
Language name : {}
53-
Language identifier : {}
54-
Language file extension : {}
55-
Project package name : {}
56-
Project package version : {}
57-
Project author : {}
58-
Project license : {}
59-
Grammar dependency name : {}
60-
Grammar dependency version : {}
61-
62-
"##,
63-
self.project_path.display(),
64-
config.language_name,
65-
config.language_id,
66-
config.language_file_extension,
67-
config.project_npm_name,
68-
config.project_npm_version,
69-
config.project_author,
70-
config.project_license,
71-
config.grammar_npm_name,
72-
config.grammar_npm_version,
73-
};
74-
let confirm = Confirm::new()
75-
.with_prompt("Generate project")
76-
.default(true)
77-
.interact()?;
78-
if !confirm {
79-
println!("Project not created.")
46+
let mut config = ProjectSettings::default();
47+
loop {
48+
config.read_from_console()?;
49+
println!("Settings for new project: {}", self.project_path.display());
50+
println!("{}", config);
51+
let action = Select::new()
52+
.items(&["Generate", "Edit", "Cancel"])
53+
.default(0)
54+
.interact()?;
55+
match action {
56+
0 => {
57+
config.generate_files_into(&self.project_path)?;
58+
println!(
59+
"Project created. See {} to get started!",
60+
self.project_path.join("README.md").display(),
61+
);
62+
break;
63+
}
64+
1 => {
65+
continue;
66+
}
67+
2 => {
68+
println!("No project created.");
69+
break;
70+
}
71+
_ => unreachable!(),
72+
}
8073
}
81-
82-
config.generate_files_into(&self.project_path)?;
83-
printdoc! {r#"
84-
85-
Project created. See {} to get started!
86-
"#,
87-
self.project_path.join("README.md").display(),
88-
};
8974
Ok(())
9075
}
9176

@@ -103,6 +88,7 @@ impl InitArgs {
10388
}
10489
}
10590

91+
#[derive(Default)]
10692
struct ProjectSettings {
10793
language_name: String,
10894
language_id: String,
@@ -116,7 +102,7 @@ struct ProjectSettings {
116102
}
117103

118104
impl ProjectSettings {
119-
fn read_from_console() -> anyhow::Result<Self> {
105+
fn read_from_console(&mut self) -> anyhow::Result<Self> {
120106
printdoc! {r#"
121107
122108
Give the name of the programming language the stack graphs definitions in this
@@ -490,6 +476,33 @@ impl ProjectSettings {
490476
}
491477
}
492478

479+
impl std::fmt::Display for ProjectSettings {
480+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
481+
writedoc! {f, r##"
482+
Language name : {}
483+
Language identifier : {}
484+
Language file extension : {}
485+
Project package name : {}
486+
Project package version : {}
487+
Project author : {}
488+
Project license : {}
489+
Grammar dependency name : {}
490+
Grammar dependency version : {}
491+
492+
"##,
493+
self.language_name,
494+
self.language_id,
495+
self.language_file_extension,
496+
self.project_npm_name,
497+
self.project_npm_version,
498+
self.project_author,
499+
self.project_license,
500+
self.grammar_npm_name,
501+
self.grammar_npm_version,
502+
}
503+
}
504+
}
505+
493506
fn regex_validator<'a>(regex: &'a Regex) -> impl Validator<String, Err = String> + 'a {
494507
struct RegexValidator<'a>(&'a Regex);
495508
impl Validator<String> for RegexValidator<'_> {

0 commit comments

Comments
 (0)