@@ -35,29 +35,36 @@ pub mod internal {
3535 }
3636}
3737
38- pub fn run < I , A > ( args : I , bin_name : Option < String > )
38+ pub fn run < I , A > ( args : I , bin_name : Option < String > , detected_manager : Option < String > )
3939where
4040 I : IntoIterator < Item = A > ,
4141 A : Into < OsString > + Clone ,
4242{
43- if let Err ( e) = try_run ( args, bin_name) {
43+ if let Err ( e) = try_run ( args, bin_name, detected_manager ) {
4444 eprintln ! ( "{BOLD}{RED}error{RESET}: {e:#}" ) ;
4545 exit ( 1 ) ;
4646 }
4747}
4848
49- fn try_run < I , A > ( args : I , bin_name : Option < String > ) -> anyhow:: Result < ( ) >
49+ fn try_run < I , A > (
50+ args : I ,
51+ bin_name : Option < String > ,
52+ detected_manager : Option < String > ,
53+ ) -> anyhow:: Result < ( ) >
5054where
5155 I : IntoIterator < Item = A > ,
5256 A : Into < OsString > + Clone ,
5357{
58+ let detected_manager = detected_manager. and_then ( |p| p. parse :: < PackageManager > ( ) . ok ( ) ) ;
5459 let args = cli:: parse ( args. into_iter ( ) . map ( Into :: into) . collect ( ) , bin_name) ?;
5560 let defaults = cli:: Args :: default ( ) ;
5661 let cli:: Args {
5762 skip,
5863 mobile,
5964 alpha,
60- ..
65+ manager,
66+ project_name,
67+ template,
6168 } = args;
6269 let cwd = std:: env:: current_dir ( ) ?;
6370
7481
7582 // Project name used for the project directory name
7683 // and if valid, it will also be used in Cargo.toml, Package.json ...etc
77- let project_name = args . project_name . unwrap_or_else ( || {
84+ let project_name = project_name. unwrap_or_else ( || {
7885 if skip {
7986 defaults. project_name . unwrap ( )
8087 } else {
@@ -142,7 +149,7 @@ where
142149 } ;
143150
144151 // Prompt for category if a package manger is not passed on the command line
145- let category = if args . manager . is_none ( ) && !skip {
152+ let category = if manager. is_none ( ) && !skip {
146153 // Filter managers if a template is passed on the command line
147154 let managers = PackageManager :: ALL . to_vec ( ) ;
148155 let managers = args
@@ -158,11 +165,24 @@ where
158165
159166 // Filter categories based on the detected package mangers
160167 let categories = Category :: ALL . to_vec ( ) ;
161- let categories = categories
168+ let mut categories = categories
162169 . into_iter ( )
163170 . filter ( |c| c. package_managers ( ) . iter ( ) . any ( |p| managers. contains ( p) ) )
164171 . collect :: < Vec < _ > > ( ) ;
165172
173+ // sort categories so the most relevant category
174+ // based on the auto-detected package manager is selected first
175+ categories. sort_by ( |a, b| {
176+ detected_manager
177+ . map ( |p| b. package_managers ( ) . contains ( & p) )
178+ . unwrap_or ( false )
179+ . cmp (
180+ & detected_manager
181+ . map ( |p| a. package_managers ( ) . contains ( & p) )
182+ . unwrap_or ( false ) ,
183+ )
184+ } ) ;
185+
166186 // If only one category is detected, skip prompt
167187 if categories. len ( ) == 1 {
168188 Some ( categories[ 0 ] )
@@ -181,20 +201,28 @@ where
181201
182202 // Package manager which will be used for rendering the template
183203 // and the after-render instructions
184- let pkg_manager = args . manager . unwrap_or_else ( || {
204+ let pkg_manager = manager. unwrap_or_else ( || {
185205 if skip {
186206 defaults. manager . unwrap ( )
187207 } else {
188208 let category = category. unwrap ( ) ;
189- let managers = category. package_managers ( ) ;
209+
210+ let mut managers = category. package_managers ( ) . to_owned ( ) ;
211+ // sort managers so the auto-detected package manager is selected first
212+ managers. sort_by ( |a, b| {
213+ detected_manager
214+ . map ( |p| p == * b)
215+ . unwrap_or ( false )
216+ . cmp ( & detected_manager. map ( |p| p == * a) . unwrap_or ( false ) )
217+ } ) ;
190218
191219 // If only one package manager is detected, skip prompt
192220 if managers. len ( ) == 1 {
193221 managers[ 0 ]
194222 } else {
195223 let index = Select :: with_theme ( & ColorfulTheme :: default ( ) )
196224 . with_prompt ( "Choose your package manager" )
197- . items ( managers)
225+ . items ( & managers)
198226 . default ( 0 )
199227 . interact ( )
200228 . unwrap ( ) ;
@@ -206,7 +234,7 @@ where
206234 let templates_no_flavors = pkg_manager. templates_no_flavors ( ) ;
207235
208236 // Template to render
209- let template = args . template . unwrap_or_else ( || {
237+ let template = template. unwrap_or_else ( || {
210238 if skip {
211239 defaults. template . unwrap ( )
212240 } else {
0 commit comments