@@ -17,7 +17,7 @@ use std::{
1717 process:: exit,
1818 time:: SystemTime ,
1919} ;
20- use structopt:: StructOpt ;
20+ use structopt:: { clap :: arg_enum , StructOpt } ;
2121use tokio:: fs:: { create_dir_all, remove_dir_all, remove_file} ;
2222
2323const TEMPLATE : & str = concat ! (
@@ -111,6 +111,14 @@ enum SubCommand {
111111 ListTarget {
112112 #[ structopt( long) ]
113113 json_format : bool ,
114+ #[ structopt(
115+ long,
116+ case_insensitive = true ,
117+ possible_values = & ListTarget :: variants( ) ,
118+ default_value = "Bin Example Test UnitTest" ,
119+ value_delimiter = " " ,
120+ ) ]
121+ targets : Vec < ListTarget > ,
114122 } ,
115123 /// Open debugger view in VS Code
116124 Open {
@@ -129,6 +137,16 @@ enum SubCommand {
129137 } ,
130138}
131139
140+ arg_enum ! {
141+ #[ derive( Debug , PartialEq ) ]
142+ enum ListTarget {
143+ Bin ,
144+ Example ,
145+ Test ,
146+ UnitTest ,
147+ }
148+ }
149+
132150#[ tokio:: main]
133151async fn main ( ) -> Result < ( ) > {
134152 env_logger:: init ( ) ;
@@ -347,7 +365,10 @@ async fn main() -> Result<()> {
347365 println ! ( "{}" , serde_json:: json!( arr) ) ;
348366 }
349367 }
350- SubCommand :: ListTarget { json_format } => list_target ( workspace, json_format)
368+ SubCommand :: ListTarget {
369+ json_format,
370+ targets,
371+ } => list_target ( workspace, json_format, targets)
351372 . await
352373 . context ( "Fail to list target" ) ?,
353374 SubCommand :: Open { idx } => {
@@ -858,7 +879,11 @@ fn list_firedbg_runs(firedbg_runs: Vec<PathBuf>) {
858879 }
859880}
860881
861- async fn list_target ( workspace : & Workspace , json_format : bool ) -> Result < ( ) > {
882+ async fn list_target (
883+ workspace : & Workspace ,
884+ json_format : bool ,
885+ targets : Vec < ListTarget > ,
886+ ) -> Result < ( ) > {
862887 #[ derive( Debug , Serialize ) ]
863888 struct Target < ' a > {
864889 binaries : Vec < & ' a Binary > ,
@@ -880,17 +905,37 @@ async fn list_target(workspace: &Workspace, json_format: bool) -> Result<()> {
880905 test_cases : Vec < String > ,
881906 }
882907
883- let binaries: Vec < _ > = workspace
884- . packages
885- . iter ( )
886- . flat_map ( |package| & package. binaries )
887- . collect ( ) ;
908+ let list_all = targets. contains ( & ListTarget :: Bin )
909+ && targets. contains ( & ListTarget :: Example )
910+ && targets. contains ( & ListTarget :: Test )
911+ && targets. contains ( & ListTarget :: UnitTest ) ;
912+ let list_partial = !list_all
913+ && targets. iter ( ) . any ( |t| {
914+ matches ! (
915+ t,
916+ ListTarget :: Bin | ListTarget :: Example | ListTarget :: Test | ListTarget :: UnitTest
917+ )
918+ } ) ;
888919
889- let examples: Vec < _ > = workspace
890- . packages
891- . iter ( )
892- . flat_map ( |package| & package. examples )
893- . collect ( ) ;
920+ let binaries: Vec < _ > = if list_all || ( list_partial && targets. contains ( & ListTarget :: Bin ) ) {
921+ workspace
922+ . packages
923+ . iter ( )
924+ . flat_map ( |package| & package. binaries )
925+ . collect ( )
926+ } else {
927+ Vec :: new ( )
928+ } ;
929+
930+ let examples: Vec < _ > = if list_all || ( list_partial && targets. contains ( & ListTarget :: Example ) ) {
931+ workspace
932+ . packages
933+ . iter ( )
934+ . flat_map ( |package| & package. examples )
935+ . collect ( )
936+ } else {
937+ Vec :: new ( )
938+ } ;
894939
895940 fn handle_tests < ' a > ( ( package, test) : & ' a ( & ' a Package , Option < & ' a Test > ) ) -> TestType {
896941 if let Some ( test) = test {
@@ -926,13 +971,15 @@ async fn list_target(workspace: &Workspace, json_format: bool) -> Result<()> {
926971 package
927972 . tests
928973 . iter ( )
974+ . filter ( |_| list_all || ( list_partial && targets. contains ( & ListTarget :: Test ) ) )
929975 . map ( |test| ( package, Some ( test) ) )
930976 . collect :: < Vec < _ > > ( )
931977 } )
932978 . chain (
933979 workspace
934980 . packages
935981 . iter ( )
982+ . filter ( |_| list_all || ( list_partial && targets. contains ( & ListTarget :: UnitTest ) ) )
936983 . filter ( |package| package. has_lib )
937984 . map ( |package| ( package, None ) ) ,
938985 )
@@ -999,8 +1046,12 @@ async fn list_target(workspace: &Workspace, json_format: bool) -> Result<()> {
9991046 create_dir_all ( firedbg_dir)
10001047 . await
10011048 . with_context ( || format ! ( "Fail to create directory: `{firedbg_dir}`" ) ) ?;
1002- let path = & format ! ( "{firedbg_dir}/target.json" ) ;
1003- to_json_file ( path, & target)
1049+ let path = if !list_all && list_partial && targets. contains ( & ListTarget :: UnitTest ) {
1050+ format ! ( "{firedbg_dir}/target-unit-test.json" )
1051+ } else {
1052+ format ! ( "{firedbg_dir}/target.json" )
1053+ } ;
1054+ to_json_file ( & path, & target)
10041055 . await
10051056 . with_context ( || format ! ( "Fail to create JSON file: `{path}`" ) ) ?;
10061057 Ok ( ( ) )
0 commit comments