From 44b5ad695d16764859db125381fc9646697eeb70 Mon Sep 17 00:00:00 2001 From: John Vandenberg Date: Wed, 18 Jan 2023 06:24:44 +0800 Subject: [PATCH] allow using published client crate (#246) --- Cargo.lock | 50 ++++++++++++++++++++++++++++++++++++++++++ README.md | 31 +++++++++++++++++--------- progenitor/Cargo.toml | 4 ++-- progenitor/src/main.rs | 47 ++++++++++++++++++++++++++++++++------- 4 files changed, 112 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5cb76b8..0e6f31f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -109,6 +109,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b9c056b9ed43aee5e064b683aa1ec783e19c6acec7559e3ae931b7490472fbe" dependencies = [ "cargo-lock", + "git2", ] [[package]] @@ -140,6 +141,9 @@ name = "cc" version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +dependencies = [ + "jobserver", +] [[package]] name = "cfg-if" @@ -589,6 +593,19 @@ dependencies = [ "wasi 0.10.2+wasi-snapshot-preview1", ] +[[package]] +name = "git2" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2994bee4a3a6a51eb90c218523be382fd7ea09b16380b9312e9dbe955ff7c7d1" +dependencies = [ + "bitflags", + "libc", + "libgit2-sys", + "log", + "url", +] + [[package]] name = "h2" version = "0.3.10" @@ -808,6 +825,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +[[package]] +name = "jobserver" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.59" @@ -829,6 +855,30 @@ version = "0.2.137" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" +[[package]] +name = "libgit2-sys" +version = "0.14.1+1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a07fb2692bc3593bda59de45a502bb3071659f2c515e28c71e728306b038e17" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] + +[[package]] +name = "libz-sys" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.1.3" diff --git a/README.md b/README.md index 3b0dcee..3e557d0 100644 --- a/README.md +++ b/README.md @@ -153,25 +153,36 @@ For example: `cargo run --bin progenitor -- -i sample_openapi/keeper.json -o keeper -n keeper -v 0.1.0` -This will produce a package in the specified directory. The output has no -persistent dependency on Progenitor including the `progenitor-client` crate. +This will produce a package in the specified directory. + +The output will use the published `progenitor-client` crate by default +if progenitor was built from a released version. However, when using progenitor +built from the repository, the `progenitor-client` will be inlined into the +static crate by default. The command line flag `--include-client` can be used +to override the default behaviour. + +To ensure the output has no persistent dependency on Progenitor, enable `--include-client`. + Here is an excerpt from the emitted `Cargo.toml`: ```toml [dependencies] -chrono = { version = "0.4", features = ["serde"] } -futures = "0.3" -percent-encoding = "2.1" -reqwest = { version = "0.11", features = ["json", "stream"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -uuid = { version = ">=0.8.0, <2.0.0", features = ["serde", "v4"] } +bytes = "1.3.0" +chrono = { version = "0.4.23", default-features=false, features = ["serde"] } +futures-core = "0.3.25" +percent-encoding = "2.2.0" +reqwest = { version = "0.11.13", default-features=false, features = ["json", "stream"] } +serde = { version = "1.0.152", features = ["derive"] } +serde_urlencoded = "0.7.1" + ``` +The dependency versions in the generated `Cargo.toml` are the same as the +versions that were used when progenitor was built. + Note that there is a dependency on `percent-encoding` which macro- and build.rs-generated clients is included from `progenitor-client`. - ## Generation Styles Progenitor can generate two distinct interface styles: positional and builder diff --git a/progenitor/Cargo.toml b/progenitor/Cargo.toml index 56ebb78..408bafc 100644 --- a/progenitor/Cargo.toml +++ b/progenitor/Cargo.toml @@ -22,8 +22,8 @@ serde_yaml = "0.9" clap = { version = "4.1.1", features = ["derive"] } [build-dependencies] -built = { version = "0.5" } -project-root = "*" +built = { version = "0.5", features = ["git2"] } +project-root = "0.2" [dev-dependencies] base64 = "0.21" diff --git a/progenitor/src/main.rs b/progenitor/src/main.rs index e2b91c3..29beba6 100644 --- a/progenitor/src/main.rs +++ b/progenitor/src/main.rs @@ -17,6 +17,11 @@ pub mod built_info { include!(concat!(env!("OUT_DIR"), "/built.rs")); } +/// Determine if current version is a pre-release or was built from a git-repo +fn release_is_unstable() -> bool { + !built_info::PKG_VERSION_PRE.is_empty() || built_info::GIT_VERSION.is_some() +} + #[derive(Parser)] struct Args { /// OpenAPI definition document (JSON or YAML) @@ -38,6 +43,9 @@ struct Args { /// SDK tag style #[clap(value_enum, long, default_value_t = TagArg::Merged)] tags: TagArg, + /// Include client + #[clap(default_value = match release_is_unstable() { true => "true", false => "false" }, long, action = clap::ArgAction::Set)] + include_client: bool, } #[derive(Copy, Clone, ValueEnum)] @@ -135,7 +143,7 @@ fn main() -> Result<()> { \n", name, version, - dependencies(builder).join("\n"), + dependencies(builder, args.include_client).join("\n"), ); save(&toml, tomlout.as_str())?; @@ -150,7 +158,11 @@ fn main() -> Result<()> { /* * Create the Rust source file containing the generated client: */ - let lib_code = format!("mod progenitor_client;\n\n{}", api_code); + let lib_code = if args.include_client { + format!("mod progenitor_client;\n\n{}", api_code) + } else { + api_code + }; let mut librs = src.clone(); librs.push("lib.rs"); save(librs, lib_code.as_str())?; @@ -158,10 +170,12 @@ fn main() -> Result<()> { /* * Create the Rust source file containing the support code: */ - let progenitor_client_code = progenitor_client::code(); - let mut clientrs = src; - clientrs.push("progenitor_client.rs"); - save(clientrs, progenitor_client_code)?; + if args.include_client { + let progenitor_client_code = progenitor_client::code(); + let mut clientrs = src; + clientrs.push("progenitor_client.rs"); + save(clientrs, progenitor_client_code)?; + } } Err(e) => { @@ -173,7 +187,7 @@ fn main() -> Result<()> { Ok(()) } -pub fn dependencies(builder: Generator) -> Vec { +pub fn dependencies(builder: Generator, include_client: bool) -> Vec { let dependency_versions: HashMap = built_info::DEPENDENCIES .iter() .map(|(name, version)| (name.to_string(), version.to_string())) @@ -182,7 +196,6 @@ pub fn dependencies(builder: Generator) -> Vec { let mut deps = vec![ format!("bytes = \"{}\"", dependency_versions.get("bytes").unwrap()), format!("futures-core = \"{}\"", dependency_versions.get("futures-core").unwrap()), - format!("percent-encoding = \"{}\"", dependency_versions.get("percent-encoding").unwrap()), format!("reqwest = {{ version = \"{}\", default-features=false, features = [\"json\", \"stream\"] }}", dependency_versions.get("reqwest").unwrap()), format!("serde = {{ version = \"{}\", features = [\"derive\"] }}", dependency_versions.get("serde").unwrap()), format!("serde_urlencoded = \"{}\"", dependency_versions.get("serde_urlencoded").unwrap()), @@ -190,6 +203,24 @@ pub fn dependencies(builder: Generator) -> Vec { let type_space = builder.get_type_space(); + let client_version_dep: String; + if include_client { + // code included from progenitor-client needs extra dependencies + deps.push(format!( + "percent-encoding = \"{}\"", + dependency_versions.get("percent-encoding").unwrap() + )); + } else { + let crate_version = if release_is_unstable() { + "*" + } else { + built_info::PKG_VERSION + }; + client_version_dep = + format!("progenitor-client = \"{}\"", crate_version); + deps.push(client_version_dep); + } + if type_space.uses_regress() { deps.push(format!( "regress = \"{}\"",