allow using published client crate (#246)
This commit is contained in:
parent
8836d77398
commit
44b5ad695d
|
@ -109,6 +109,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5b9c056b9ed43aee5e064b683aa1ec783e19c6acec7559e3ae931b7490472fbe"
|
checksum = "5b9c056b9ed43aee5e064b683aa1ec783e19c6acec7559e3ae931b7490472fbe"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cargo-lock",
|
"cargo-lock",
|
||||||
|
"git2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -140,6 +141,9 @@ name = "cc"
|
||||||
version = "1.0.72"
|
version = "1.0.72"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
|
checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
|
||||||
|
dependencies = [
|
||||||
|
"jobserver",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
|
@ -589,6 +593,19 @@ dependencies = [
|
||||||
"wasi 0.10.2+wasi-snapshot-preview1",
|
"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]]
|
[[package]]
|
||||||
name = "h2"
|
name = "h2"
|
||||||
version = "0.3.10"
|
version = "0.3.10"
|
||||||
|
@ -808,6 +825,15 @@ version = "1.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
|
checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jobserver"
|
||||||
|
version = "0.1.25"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "js-sys"
|
name = "js-sys"
|
||||||
version = "0.3.59"
|
version = "0.3.59"
|
||||||
|
@ -829,6 +855,30 @@ version = "0.2.137"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
|
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]]
|
[[package]]
|
||||||
name = "linux-raw-sys"
|
name = "linux-raw-sys"
|
||||||
version = "0.1.3"
|
version = "0.1.3"
|
||||||
|
|
31
README.md
31
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`
|
`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
|
This will produce a package in the specified directory.
|
||||||
persistent dependency on Progenitor including the `progenitor-client` crate.
|
|
||||||
|
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`:
|
Here is an excerpt from the emitted `Cargo.toml`:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = { version = "0.4", features = ["serde"] }
|
bytes = "1.3.0"
|
||||||
futures = "0.3"
|
chrono = { version = "0.4.23", default-features=false, features = ["serde"] }
|
||||||
percent-encoding = "2.1"
|
futures-core = "0.3.25"
|
||||||
reqwest = { version = "0.11", features = ["json", "stream"] }
|
percent-encoding = "2.2.0"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
reqwest = { version = "0.11.13", default-features=false, features = ["json", "stream"] }
|
||||||
serde_json = "1.0"
|
serde = { version = "1.0.152", features = ["derive"] }
|
||||||
uuid = { version = ">=0.8.0, <2.0.0", features = ["serde", "v4"] }
|
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
|
Note that there is a dependency on `percent-encoding` which macro- and
|
||||||
build.rs-generated clients is included from `progenitor-client`.
|
build.rs-generated clients is included from `progenitor-client`.
|
||||||
|
|
||||||
|
|
||||||
## Generation Styles
|
## Generation Styles
|
||||||
|
|
||||||
Progenitor can generate two distinct interface styles: positional and builder
|
Progenitor can generate two distinct interface styles: positional and builder
|
||||||
|
|
|
@ -22,8 +22,8 @@ serde_yaml = "0.9"
|
||||||
clap = { version = "4.1.1", features = ["derive"] }
|
clap = { version = "4.1.1", features = ["derive"] }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
built = { version = "0.5" }
|
built = { version = "0.5", features = ["git2"] }
|
||||||
project-root = "*"
|
project-root = "0.2"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
base64 = "0.21"
|
base64 = "0.21"
|
||||||
|
|
|
@ -17,6 +17,11 @@ pub mod built_info {
|
||||||
include!(concat!(env!("OUT_DIR"), "/built.rs"));
|
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)]
|
#[derive(Parser)]
|
||||||
struct Args {
|
struct Args {
|
||||||
/// OpenAPI definition document (JSON or YAML)
|
/// OpenAPI definition document (JSON or YAML)
|
||||||
|
@ -38,6 +43,9 @@ struct Args {
|
||||||
/// SDK tag style
|
/// SDK tag style
|
||||||
#[clap(value_enum, long, default_value_t = TagArg::Merged)]
|
#[clap(value_enum, long, default_value_t = TagArg::Merged)]
|
||||||
tags: TagArg,
|
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)]
|
#[derive(Copy, Clone, ValueEnum)]
|
||||||
|
@ -135,7 +143,7 @@ fn main() -> Result<()> {
|
||||||
\n",
|
\n",
|
||||||
name,
|
name,
|
||||||
version,
|
version,
|
||||||
dependencies(builder).join("\n"),
|
dependencies(builder, args.include_client).join("\n"),
|
||||||
);
|
);
|
||||||
|
|
||||||
save(&toml, tomlout.as_str())?;
|
save(&toml, tomlout.as_str())?;
|
||||||
|
@ -150,7 +158,11 @@ fn main() -> Result<()> {
|
||||||
/*
|
/*
|
||||||
* Create the Rust source file containing the generated client:
|
* 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();
|
let mut librs = src.clone();
|
||||||
librs.push("lib.rs");
|
librs.push("lib.rs");
|
||||||
save(librs, lib_code.as_str())?;
|
save(librs, lib_code.as_str())?;
|
||||||
|
@ -158,11 +170,13 @@ fn main() -> Result<()> {
|
||||||
/*
|
/*
|
||||||
* Create the Rust source file containing the support code:
|
* Create the Rust source file containing the support code:
|
||||||
*/
|
*/
|
||||||
|
if args.include_client {
|
||||||
let progenitor_client_code = progenitor_client::code();
|
let progenitor_client_code = progenitor_client::code();
|
||||||
let mut clientrs = src;
|
let mut clientrs = src;
|
||||||
clientrs.push("progenitor_client.rs");
|
clientrs.push("progenitor_client.rs");
|
||||||
save(clientrs, progenitor_client_code)?;
|
save(clientrs, progenitor_client_code)?;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("gen fail: {:?}", e);
|
println!("gen fail: {:?}", e);
|
||||||
|
@ -173,7 +187,7 @@ fn main() -> Result<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dependencies(builder: Generator) -> Vec<String> {
|
pub fn dependencies(builder: Generator, include_client: bool) -> Vec<String> {
|
||||||
let dependency_versions: HashMap<String, String> = built_info::DEPENDENCIES
|
let dependency_versions: HashMap<String, String> = built_info::DEPENDENCIES
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(name, version)| (name.to_string(), version.to_string()))
|
.map(|(name, version)| (name.to_string(), version.to_string()))
|
||||||
|
@ -182,7 +196,6 @@ pub fn dependencies(builder: Generator) -> Vec<String> {
|
||||||
let mut deps = vec![
|
let mut deps = vec![
|
||||||
format!("bytes = \"{}\"", dependency_versions.get("bytes").unwrap()),
|
format!("bytes = \"{}\"", dependency_versions.get("bytes").unwrap()),
|
||||||
format!("futures-core = \"{}\"", dependency_versions.get("futures-core").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!("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 = {{ version = \"{}\", features = [\"derive\"] }}", dependency_versions.get("serde").unwrap()),
|
||||||
format!("serde_urlencoded = \"{}\"", dependency_versions.get("serde_urlencoded").unwrap()),
|
format!("serde_urlencoded = \"{}\"", dependency_versions.get("serde_urlencoded").unwrap()),
|
||||||
|
@ -190,6 +203,24 @@ pub fn dependencies(builder: Generator) -> Vec<String> {
|
||||||
|
|
||||||
let type_space = builder.get_type_space();
|
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() {
|
if type_space.uses_regress() {
|
||||||
deps.push(format!(
|
deps.push(format!(
|
||||||
"regress = \"{}\"",
|
"regress = \"{}\"",
|
||||||
|
|
Loading…
Reference in New Issue