33// cargo run --release -p azure-autorust -- -p azure_svc_queuestorage
44
55use autorust_codegen:: {
6- crates:: { list_crate_names , list_dirs } ,
6+ crates:: list_crates ,
77 gen, get_mgmt_readmes, get_svc_readmes,
88 jinja:: { CheckAllServicesYml , PublishSdksYml , PublishServicesYml , WorkspaceCargoToml } ,
99 Error , ErrorKind , Result , ResultExt , RunConfig , SpecReadme ,
1010} ;
1111use clap:: Parser ;
1212use rayon:: prelude:: * ;
13+ use std:: { collections:: BTreeSet , path:: PathBuf } ;
1314
1415#[ derive( Debug , clap:: Parser ) ]
1516struct Args {
@@ -35,15 +36,34 @@ impl Args {
3536fn main ( ) -> Result < ( ) > {
3637 let args = Args :: parse ( ) ;
3738 let packages = & args. packages ( ) ;
38- gen_crates ( packages) ?;
39- gen_services_workspace ( packages) ?;
39+
40+ let existing_crates = list_crates ( & PathBuf :: from ( "../" ) ) ?;
41+ let generated = gen_crates ( packages) ?;
42+ gen_services_workspace ( & generated) ?;
43+
4044 if packages. is_empty ( ) {
41- gen_workflow_check_all_services ( ) ?;
45+ gen_workflow_check_all_services ( & generated ) ?;
4246 if args. publish {
4347 gen_workflow_publish_sdks ( ) ?;
44- gen_workflow_publish_services ( ) ?;
48+ gen_workflow_publish_services ( & generated) ?;
49+ }
50+
51+ let removed = existing_crates. difference ( & generated) . collect :: < Vec < _ > > ( ) ;
52+ let added = generated. difference ( & existing_crates) . collect :: < Vec < _ > > ( ) ;
53+ if !removed. is_empty ( ) {
54+ println ! ( "the following crates are no longer generated:" ) ;
55+ for name in removed {
56+ println ! ( "- {name}" ) ;
57+ }
58+ }
59+ if !added. is_empty ( ) {
60+ println ! ( "the following crates are newly generated:" ) ;
61+ for name in added {
62+ println ! ( "- {name}" ) ;
63+ }
4564 }
4665 }
66+
4767 Ok ( ( ) )
4868}
4969
@@ -63,7 +83,7 @@ fn gen_crate(only_packages: &[&str], crate_type: &str, spec: &SpecReadme) -> Res
6383 }
6484}
6585
66- fn gen_crates ( only_packages : & [ & str ] ) -> Result < ( ) > {
86+ fn gen_crates ( only_packages : & [ & str ] ) -> Result < BTreeSet < String > > {
6787 let svc = get_svc_readmes ( ) ?. into_iter ( ) . map ( |x| ( "svc" . to_string ( ) , x) ) ;
6888 let mgmt = get_mgmt_readmes ( ) ?. into_iter ( ) . map ( |x| ( "mgmt" . to_string ( ) , x) ) ;
6989 let crate_iters = svc. chain ( mgmt) . collect :: < Vec < _ > > ( ) ;
@@ -77,12 +97,17 @@ fn gen_crates(only_packages: &[&str]) -> Result<()> {
7797
7898 let mut errors = vec ! [ ] ;
7999 let mut completed = vec ! [ ] ;
100+ let mut skipped = vec ! [ ] ;
80101
81102 for result in results {
82103 match result {
83104 Ok ( result) => {
84- if let Some ( result) = result {
85- completed. push ( result) ;
105+ if let Some ( ( name, tags) ) = result {
106+ if tags. is_empty ( ) {
107+ skipped. push ( name) ;
108+ } else {
109+ completed. push ( ( name, tags) ) ;
110+ }
86111 }
87112 }
88113 Err ( err) => {
@@ -98,40 +123,34 @@ fn gen_crates(only_packages: &[&str]) -> Result<()> {
98123 return Err ( Error :: new ( ErrorKind :: CodeGen , "Failed to generate some crates" ) ) ;
99124 }
100125
101- for ( package_name, tags) in completed {
126+ for ( package_name, tags) in & completed {
102127 println ! ( "{package_name}" ) ;
103- if tags. is_empty ( ) {
104- println ! ( " No tags" ) ;
105- } else {
106- for tag in tags {
107- println ! ( "- {tag}" ) ;
108- }
128+ for tag in tags {
129+ println ! ( "- {tag}" ) ;
109130 }
110131 }
111132
112- Ok ( ( ) )
113- }
133+ if !skipped. is_empty ( ) {
134+ println ! ( "the following crates were not generated due to configuration:" ) ;
135+ for name in & skipped {
136+ println ! ( "- {name}" ) ;
137+ }
138+ }
114139
115- fn gen_services_workspace ( only_packages : & [ & str ] ) -> Result < ( ) > {
116- let dirs: Vec < String > = if only_packages. is_empty ( ) {
117- list_dirs ( ) ?
118- . iter ( )
119- . map ( |dir| dir. as_str ( ) . replace ( '\\' , "/" ) . replace ( "../" , "" ) )
120- . collect ( )
121- } else {
122- only_packages
123- . iter ( )
124- . map ( |p| p. replace ( "azure_mgmt_" , "mgmt/" ) . replace ( "azure_svc_" , "svc/" ) )
125- . collect ( )
126- } ;
140+ Ok ( completed. into_iter ( ) . map ( |( package_name, _) | package_name) . collect ( ) )
141+ }
127142
143+ fn gen_services_workspace ( only_packages : & BTreeSet < String > ) -> Result < ( ) > {
144+ let dirs = only_packages
145+ . iter ( )
146+ . map ( |p| p. replace ( "azure_mgmt_" , "mgmt/" ) . replace ( "azure_svc_" , "svc/" ) )
147+ . collect ( ) ;
128148 let toml = WorkspaceCargoToml { dirs } ;
129149 toml. create ( "../Cargo.toml" ) ?;
130150 Ok ( ( ) )
131151}
132152
133- fn gen_workflow_check_all_services ( ) -> Result < ( ) > {
134- let packages = list_crate_names ( ) ?;
153+ fn gen_workflow_check_all_services ( packages : & BTreeSet < String > ) -> Result < ( ) > {
135154 let packages = & packages. iter ( ) . map ( String :: as_str) . collect ( ) ;
136155
137156 let yml = CheckAllServicesYml { packages } ;
@@ -159,8 +178,7 @@ fn gen_workflow_publish_sdks() -> Result<()> {
159178 Ok ( ( ) )
160179}
161180
162- fn gen_workflow_publish_services ( ) -> Result < ( ) > {
163- let packages = list_crate_names ( ) ?;
181+ fn gen_workflow_publish_services ( packages : & BTreeSet < String > ) -> Result < ( ) > {
164182 let packages = & packages. iter ( ) . map ( String :: as_str) . collect ( ) ;
165183 let yml = PublishServicesYml { packages } ;
166184 yml. create ( "../../.github/workflows/publish-services.yml" ) ?;
0 commit comments