88use anyhow:: anyhow;
99use clap:: Args ;
1010use clap:: ValueHint ;
11- use dialoguer:: Confirm ;
11+ use dialoguer:: Select ;
1212use dialoguer:: { Input , Validator } ;
1313use indoc:: printdoc;
1414use 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 ) ]
10692struct ProjectSettings {
10793 language_name : String ,
10894 language_id : String ,
@@ -116,7 +102,7 @@ struct ProjectSettings {
116102}
117103
118104impl 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+
493506fn 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