From dd9d1e8846a0cd3eb651ad9bfc7545d364049485 Mon Sep 17 00:00:00 2001 From: Adam Leventhal Date: Tue, 16 Nov 2021 18:00:55 -0800 Subject: [PATCH] use include_str! to trigger a rebuild when the input spec is modified (#16) * use include_str! to trigger a rebuild when the input spec is modified * update deps including typify --- Cargo.lock | 49 +++++++++++++++++++------------------ progenitor-macro/src/lib.rs | 40 ++++++++++++++++++------------ 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8d0f400..7787d09 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,9 +49,9 @@ checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cc" -version = "1.0.71" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd" +checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" [[package]] name = "cfg-if" @@ -314,9 +314,9 @@ checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" [[package]] name = "hyper" -version = "0.14.14" +version = "0.14.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b91bb1f221b6ea1f1e4371216b70f40748774c2fb5971b450c07773fb92d26b" +checksum = "436ec0091e4f20e655156a30a0df3770fe2900aa301e548e08446ec794b6953c" dependencies = [ "bytes", "futures-channel", @@ -400,9 +400,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.106" +version = "0.2.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a60553f9a9e039a333b4e9b20573b9e9b9c0bb3a11e201ccc48ef4283456d673" +checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" [[package]] name = "log" @@ -544,9 +544,9 @@ checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.70" +version = "0.9.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6517987b3f8226b5da3661dad65ff7f300cc59fb5ea8333ca191fc65fde3edf" +checksum = "7df13d165e607909b363a4757a6f133f8a818a74e9d3a98d09c6128e15fa4c73" dependencies = [ "autocfg", "cc", @@ -814,9 +814,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "271ac0c667b8229adf70f0f957697c96fafd7486ab7481e15dc5e45e3e6a4368" dependencies = [ "dyn-clone", "schemars_derive", @@ -826,9 +826,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "6ebda811090b257411540779860bc09bf321bc587f58d2c5864309d1566214e7" dependencies = [ "proc-macro2", "quote", @@ -910,9 +910,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e466864e431129c7e0d3476b92f20458e5879919a0596c6472738d9fa2d342f8" +checksum = "e277c495ac6cd1a01a58d0a0c574568b4d1ddf14f59965c6a58b8d96400b54f3" dependencies = [ "itoa", "ryu", @@ -1004,9 +1004,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" dependencies = [ "tinyvec_macros", ] @@ -1019,9 +1019,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "588b2d10a336da58d877567cd8fb8a14b463e2104910f8132cd054b4b96e29ee" +checksum = "70e992e41e0d2fb9f755b37446f20900f64446ef54874f40a60c78f021ac6144" dependencies = [ "autocfg", "bytes", @@ -1103,8 +1103,8 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "typify" -version = "0.0.2" -source = "git+https://github.com/oxidecomputer/typify#69bc7f3e42fdeee40229fb8305773377b1d5e4d7" +version = "0.0.6-dev" +source = "git+https://github.com/oxidecomputer/typify#58bfcd02a2cd74bff047e9e8ad6e4f2b4f84f3af" dependencies = [ "typify-impl", "typify-macro", @@ -1112,12 +1112,13 @@ dependencies = [ [[package]] name = "typify-impl" -version = "0.0.2" -source = "git+https://github.com/oxidecomputer/typify#69bc7f3e42fdeee40229fb8305773377b1d5e4d7" +version = "0.0.6-dev" +source = "git+https://github.com/oxidecomputer/typify#58bfcd02a2cd74bff047e9e8ad6e4f2b4f84f3af" dependencies = [ "convert_case", "proc-macro2", "quote", + "rustfmt-wrapper", "schemars", "serde_json", "syn", @@ -1126,8 +1127,8 @@ dependencies = [ [[package]] name = "typify-macro" -version = "0.0.2" -source = "git+https://github.com/oxidecomputer/typify#69bc7f3e42fdeee40229fb8305773377b1d5e4d7" +version = "0.0.6-dev" +source = "git+https://github.com/oxidecomputer/typify#58bfcd02a2cd74bff047e9e8ad6e4f2b4f84f3af" dependencies = [ "proc-macro2", "quote", diff --git a/progenitor-macro/src/lib.rs b/progenitor-macro/src/lib.rs index ff09445..c8ae793 100644 --- a/progenitor-macro/src/lib.rs +++ b/progenitor-macro/src/lib.rs @@ -5,7 +5,7 @@ use std::path::Path; use openapiv3::OpenAPI; use proc_macro::TokenStream; use progenitor_impl::Generator; -use quote::ToTokens; +use quote::{quote, ToTokens}; use syn::{ parse::{Parse, ParseStream}, ExprClosure, LitStr, Token, @@ -90,31 +90,39 @@ fn do_generate_api(item: TokenStream) -> Result { ); let path = dir.join(file.value()); + let path_str = path.to_string_lossy(); - let content = std::fs::read_to_string(&path).map_err(|e| { - syn::Error::new( - file.span(), - format!("couldn't read file {}: {}", file.value(), e.to_string()), - ) - })?; - - let spec = serde_json::from_str::(&content).map_err(|e| { - syn::Error::new( - file.span(), - format!("failed to parse {}: {}", file.value(), e.to_string()), - ) - })?; + let spec: OpenAPI = + serde_json::from_reader(std::fs::File::open(&path).map_err(|e| { + syn::Error::new( + file.span(), + format!("couldn't read file {}: {}", path_str, e.to_string()), + ) + })?) + .map_err(|e| { + syn::Error::new( + file.span(), + format!("failed to parse {}: {}", path_str, e.to_string()), + ) + })?; let mut builder = Generator::new(); inner.map(|inner_type| builder.with_inner_type(inner_type)); pre.map(|pre_hook| builder.with_pre_hook(pre_hook)); post.map(|post_hook| builder.with_post_hook(post_hook)); - let ret = builder.generate_tokens(&spec).map_err(|e| { + let code = builder.generate_tokens(&spec).map_err(|e| { syn::Error::new( file.span(), format!("generation error for {}: {}", file.value(), e.to_string()), ) })?; - Ok(ret.into()) + let output = quote! { + #code + + // Force a rebuild when the given file is modified. + const _: &str = include_str!(#path_str); + }; + + Ok(output.into()) }