@@ -6,9 +6,10 @@ use autorust_codegen::{
66 crates:: { list_crate_names, list_dirs} ,
77 gen, get_mgmt_readmes, get_svc_readmes,
88 jinja:: { CheckAllServicesYml , PublishSdksYml , PublishServicesYml , WorkspaceCargoToml } ,
9- Error , ErrorKind , Result , RunConfig ,
9+ ErrorKind , Result , ResultExt , RunConfig , SpecReadme ,
1010} ;
1111use clap:: Parser ;
12+ use rayon:: prelude:: * ;
1213
1314#[ derive( Debug , clap:: Parser ) ]
1415struct Args {
@@ -43,29 +44,47 @@ fn main() -> Result<()> {
4344 gen_workflow_publish_services ( ) ?;
4445 }
4546 }
46- if args. fmt {
47- fmt ( packages) ?;
48- }
4947 Ok ( ( ) )
5048}
5149
52- fn gen_crates ( only_packages : & [ & str ] ) -> Result < ( ) > {
53- let svc = get_svc_readmes ( ) ?. into_iter ( ) . map ( |x| ( "svc" , x) ) ;
54- let mgmt = get_mgmt_readmes ( ) ?. into_iter ( ) . map ( |x| ( "mgmt" , x) ) ;
55-
56- for ( i, ( crate_type, spec) ) in svc. chain ( mgmt) . enumerate ( ) {
57- let output_folder = format ! ( "../{crate_type}" ) ;
58- let prefix = format ! ( "azure_{crate_type}_" ) ;
50+ fn gen_crate ( only_packages : & [ & str ] , crate_type : & str , spec : & SpecReadme ) -> Result < Option < ( String , Vec < String > ) > > {
51+ let output_folder = format ! ( "../{crate_type}" ) ;
52+ let prefix = format ! ( "azure_{crate_type}_" ) ;
5953
60- let run_config = RunConfig :: new ( & prefix) ;
61- let package_name = gen:: package_name ( & spec, & run_config) ;
62- if !only_packages. is_empty ( ) && !only_packages. contains ( & package_name. as_str ( ) ) {
63- continue ;
64- }
54+ let run_config = RunConfig :: new ( & prefix) ;
55+ let package_name = gen:: package_name ( spec, & run_config) ;
6556
66- println ! ( "{package_name} ({i})" ) ;
67- gen:: gen_crate ( & package_name, & spec, & run_config, & output_folder) ?;
57+ if !only_packages. is_empty ( ) && !only_packages. contains ( & package_name. as_str ( ) ) {
58+ Ok ( None )
59+ } else {
60+ let tags = gen:: gen_crate ( & package_name, spec, & run_config, & output_folder)
61+ . with_context ( ErrorKind :: CodeGen , || format ! ( "generating {package_name}" ) ) ?;
62+ Ok ( Some ( ( package_name, tags) ) )
6863 }
64+ }
65+
66+ fn gen_crates ( only_packages : & [ & str ] ) -> Result < ( ) > {
67+ let svc = get_svc_readmes ( ) ?. into_iter ( ) . map ( |x| ( "svc" . to_string ( ) , x) ) ;
68+ let mgmt = get_mgmt_readmes ( ) ?. into_iter ( ) . map ( |x| ( "mgmt" . to_string ( ) , x) ) ;
69+ let crate_iters = svc. chain ( mgmt) . collect :: < Vec < _ > > ( ) ;
70+
71+ let results: Result < Vec < _ > > = crate_iters
72+ . par_iter ( )
73+ . map ( |( crate_type, spec) | gen_crate ( only_packages, crate_type, spec) )
74+ . collect :: < Vec < _ > > ( )
75+ . into_iter ( )
76+ . collect ( ) ;
77+
78+ ( results?) . into_iter ( ) . flatten ( ) . for_each ( |( package_name, tags) | {
79+ println ! ( "{package_name}" ) ;
80+ if tags. is_empty ( ) {
81+ println ! ( " No tags" ) ;
82+ } else {
83+ for tag in tags {
84+ println ! ( "- {tag}" ) ;
85+ }
86+ }
87+ } ) ;
6988
7089 Ok ( ( ) )
7190}
@@ -124,22 +143,3 @@ fn gen_workflow_publish_services() -> Result<()> {
124143 yml. create ( "../../.github/workflows/publish-services.yml" ) ?;
125144 Ok ( ( ) )
126145}
127-
128- /// Run `cargo fmt` on the services workspace or a subset of packages.
129- fn fmt ( only_packages : & [ & str ] ) -> Result < ( ) > {
130- let services_dir = "../" ;
131- let mut args = vec ! [ "fmt" ] ;
132- if !only_packages. is_empty ( ) {
133- args. push ( "-p" ) ;
134- for package in only_packages {
135- args. push ( package) ;
136- }
137- }
138- let out = std:: process:: Command :: new ( "cargo" ) . current_dir ( services_dir) . args ( args) . output ( ) ?;
139- if !out. status . success ( ) {
140- println ! ( "cargo fmt failed" ) ;
141- println ! ( "{}" , std:: str :: from_utf8( & out. stderr) ?) ;
142- return Err ( Error :: new ( ErrorKind :: Io , "cargo fmt failed" ) ) ;
143- }
144- Ok ( ( ) )
145- }
0 commit comments