@@ -10,7 +10,7 @@ use crate::{
1010 category:: Category ,
1111 deps:: print_missing_deps,
1212 package_manager:: PackageManager ,
13- utils:: { colors:: * , theme :: ColorfulTheme } ,
13+ utils:: { colors:: * , dialoguer_theme :: ColorfulTheme } ,
1414} ;
1515
1616mod args;
7171 project_name,
7272 template,
7373 force,
74+ identifier,
7475 } = args;
7576 let cwd = std:: env:: current_dir ( ) ?;
7677
@@ -79,14 +80,15 @@ where
7980 let project_name = match project_name {
8081 Some ( name) => name,
8182 None => {
83+ let default = defaults
84+ . project_name
85+ . context ( "default project_name not set" ) ?;
8286 if skip {
83- defaults
84- . project_name
85- . context ( "default project_name not set" ) ?
87+ default
8688 } else {
8789 Input :: < String > :: with_theme ( & ColorfulTheme :: default ( ) )
8890 . with_prompt ( "Project name" )
89- . default ( "tauri-app" . into ( ) )
91+ . default ( default )
9092 . interact_text ( ) ?
9193 . trim ( )
9294 . into ( )
@@ -97,10 +99,10 @@ where
9799 let target_dir = cwd. join ( & project_name) ;
98100
99101 // Package name used in Cargo.toml, Package.json ...etc
100- let package_name = if is_valid_pkg_name ( & project_name) {
102+ let package_name = if utils :: is_valid_pkg_name ( & project_name) {
101103 project_name. clone ( )
102104 } else {
103- let valid_name = to_valid_pkg_name ( & project_name) ;
105+ let valid_name = utils :: to_valid_pkg_name ( & project_name) ;
104106 if skip {
105107 valid_name
106108 } else {
@@ -109,7 +111,7 @@ where
109111 . default ( valid_name. clone ( ) )
110112 . with_initial_text ( valid_name)
111113 . validate_with ( |input : & String | {
112- if is_valid_pkg_name ( input) {
114+ if utils :: is_valid_pkg_name ( input) {
113115 Ok ( ( ) )
114116 } else {
115117 Err ( "Package name should only include lowercase alphanumeric character and hyphens \" -\" and doesn't start with numbers" )
@@ -120,6 +122,23 @@ where
120122 }
121123 } ;
122124
125+ let identifier = match identifier {
126+ Some ( name) => name,
127+ None => {
128+ let default = format ! ( "com.{package_name}.app" ) ;
129+ if skip {
130+ default
131+ } else {
132+ Input :: < String > :: with_theme ( & ColorfulTheme :: default ( ) )
133+ . with_prompt ( "Identifier" )
134+ . default ( default)
135+ . interact_text ( ) ?
136+ . trim ( )
137+ . into ( )
138+ }
139+ }
140+ } ;
141+
123142 // Confirm deleting the target project directory if not empty
124143 if target_dir. exists ( ) && target_dir. read_dir ( ) ?. next ( ) . is_some ( ) {
125144 let overwrite = if force {
@@ -303,7 +322,14 @@ where
303322 }
304323
305324 // Render the template
306- template. render ( & target_dir, pkg_manager, & project_name, & package_name, rc) ?;
325+ template. render (
326+ & target_dir,
327+ pkg_manager,
328+ & project_name,
329+ & package_name,
330+ & identifier,
331+ rc,
332+ ) ?;
307333
308334 // Print post-render instructions
309335 println ! ( ) ;
@@ -350,70 +376,3 @@ where
350376 println ! ( ) ;
351377 Ok ( ( ) )
352378}
353-
354- fn is_valid_pkg_name ( project_name : & str ) -> bool {
355- let mut chars = project_name. chars ( ) . peekable ( ) ;
356- !project_name. is_empty ( )
357- && !chars. peek ( ) . map ( |c| c. is_ascii_digit ( ) ) . unwrap_or_default ( )
358- && !chars. any ( |ch| !( ch. is_alphanumeric ( ) || ch == '-' || ch == '_' ) || ch. is_uppercase ( ) )
359- }
360-
361- fn to_valid_pkg_name ( project_name : & str ) -> String {
362- let ret = project_name
363- . trim ( )
364- . to_lowercase ( )
365- . replace ( [ ':' , ';' , ' ' , '~' ] , "-" )
366- . replace ( [ '.' , '\\' , '/' ] , "" ) ;
367-
368- let ret = ret
369- . chars ( )
370- . skip_while ( |ch| ch. is_ascii_digit ( ) || * ch == '-' )
371- . collect :: < String > ( ) ;
372-
373- if ret. is_empty ( ) {
374- "tauri-app" . to_string ( )
375- } else {
376- ret
377- }
378- }
379-
380- #[ cfg( test) ]
381- mod test {
382- use super :: * ;
383- #[ test]
384- fn valiadtes_pkg_name ( ) {
385- assert ! ( is_valid_pkg_name( "tauri-app" ) ) ;
386- assert ! ( is_valid_pkg_name( "tauri_app" ) ) ;
387- assert ! ( is_valid_pkg_name( "t2auriapp" ) ) ;
388- assert ! ( !is_valid_pkg_name( "1tauriapp" ) ) ;
389- assert ! ( !is_valid_pkg_name( "tauri app" ) ) ;
390- assert ! ( !is_valid_pkg_name( "tauri:app" ) ) ;
391- assert ! ( !is_valid_pkg_name( "tauri.app" ) ) ;
392- assert ! ( !is_valid_pkg_name( "tauri/app" ) ) ;
393- assert ! ( !is_valid_pkg_name( "tauri\\ app" ) ) ;
394- assert ! ( !is_valid_pkg_name( "tauri~app" ) ) ;
395- assert ! ( !is_valid_pkg_name( "Tauriapp" ) ) ;
396- }
397-
398- #[ test]
399- fn converts_to_valid_pkg_name ( ) {
400- assert_eq ! ( to_valid_pkg_name( "tauri-app" ) , "tauri-app" ) ;
401- assert_eq ! ( to_valid_pkg_name( "tauri_app" ) , "tauri_app" ) ;
402- assert_eq ! ( to_valid_pkg_name( "t2auriapp" ) , "t2auriapp" ) ;
403- assert_eq ! ( to_valid_pkg_name( "1tauriapp" ) , "tauriapp" ) ;
404- assert_eq ! ( to_valid_pkg_name( "123tauriapp" ) , "tauriapp" ) ;
405- assert_eq ! ( to_valid_pkg_name( "123-tauriapp" ) , "tauriapp" ) ;
406- assert_eq ! ( to_valid_pkg_name( "tauri app" ) , "tauri-app" ) ;
407- assert_eq ! ( to_valid_pkg_name( "tauri:app" ) , "tauri-app" ) ;
408- assert_eq ! ( to_valid_pkg_name( "tauri;app" ) , "tauri-app" ) ;
409- assert_eq ! ( to_valid_pkg_name( "tauri.app" ) , "tauriapp" ) ;
410- assert_eq ! ( to_valid_pkg_name( "tauri/app" ) , "tauriapp" ) ;
411- assert_eq ! ( to_valid_pkg_name( "tauri\\ app" ) , "tauriapp" ) ;
412- assert_eq ! ( to_valid_pkg_name( "tauri~app" ) , "tauri-app" ) ;
413- assert_eq ! ( to_valid_pkg_name( "-tauri.app" ) , "tauriapp" ) ;
414- assert_eq ! ( to_valid_pkg_name( "-123tauri.app" ) , "tauriapp" ) ;
415- assert_eq ! ( to_valid_pkg_name( "-2-123tau2ri-app-2" ) , "tau2ri-app-2" ) ;
416- assert_eq ! ( to_valid_pkg_name( "1-2-3tau2ri-app2-" ) , "tau2ri-app2-" ) ;
417- assert_eq ! ( to_valid_pkg_name( "Tauriapp" ) , "tauriapp" ) ;
418- }
419- }
0 commit comments