Skip to content

Commit feadac4

Browse files
committed
Refactoring & more schema features coverage
1 parent 0b9ef8a commit feadac4

File tree

11 files changed

+274
-6499
lines changed

11 files changed

+274
-6499
lines changed

openapi-converter/Cargo.lock

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

openapi-converter/clients_schema_to_openapi/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,7 @@ either_n = "0.2.0"
2121
regex = "1.8"
2222
maplit = "1.0"
2323

24+
argh = "0.1"
25+
2426
tracing = "0.1.37"
2527
tracing-subscriber = "0.3.16"

openapi-converter/clients_schema_to_openapi/src/components.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use openapiv3::{Components, Parameter, ReferenceOr, RequestBody, Response, Schema, StatusCode};
22
use clients_schema::{TypeDefinition, TypeName, TypeRegistry};
3-
use crate::schemas::SchemaName;
3+
use crate::utils::SchemaName;
44

55
pub struct TypesAndComponents<'a> {
66
pub types: TypeRegistry<'a>,

openapi-converter/clients_schema_to_openapi/src/lib.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,36 @@
11
mod paths;
22
mod schemas;
33
mod components;
4+
mod utils;
45

5-
use std::io::Write;
6+
use std::collections::HashSet;
7+
use std::io::{BufWriter, Write};
68
use std::path::Path;
79
use openapiv3::{Components, OpenAPI};
810

911
use clients_schema::{Endpoint, Model};
1012
use crate::components::TypesAndComponents;
1113

1214
pub fn convert_schema_file(path: impl AsRef<Path>, endpoint_filter: fn(e: &Endpoint) -> bool, out: impl Write) -> anyhow::Result<()> {
13-
let file = std::fs::File::open(path)?;
14-
let model: Model = serde_json::from_reader(file)?;
1515

16-
let openapi = convert_schema(&model, endpoint_filter)?;
16+
// Parsing from a string is faster than using a buffered reader when there is a need for look-ahead
17+
// See https://github.com/serde-rs/json/issues/160
18+
let json = &std::fs::read_to_string(path)?;
19+
let json_deser = &mut serde_json::Deserializer::from_str(&json);
20+
21+
let mut unused = HashSet::new();
22+
let model: Model = serde_ignored::deserialize(json_deser, |path| {
23+
if let serde_ignored::Path::Map {parent: _, key} = path {
24+
unused.insert(key);
25+
}
26+
})?;
27+
if !unused.is_empty() {
28+
let msg = unused.into_iter().collect::<Vec<_>>().join(", ");
29+
tracing::warn!("Unknown fields found in schema.json: {}", msg);
30+
}
1731

18-
serde_json::to_writer_pretty(out, &openapi)?;
32+
let openapi = convert_schema(&model, endpoint_filter)?;
33+
//serde_json::to_writer_pretty(BufWriter::new(out), &openapi)?;
1934
Ok(())
2035
}
2136

openapi-converter/clients_schema_to_openapi/src/main.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
11
use tracing::Level;
2+
use tracing_subscriber::fmt::format::FmtSpan;
23
use tracing_subscriber::FmtSubscriber;
34

5+
use argh::FromArgs;
6+
7+
8+
9+
410
fn main() -> anyhow::Result<()> {
511

12+
13+
614
let subscriber = FmtSubscriber::builder()
15+
.with_writer(std::io::stderr)
716
.with_max_level(Level::TRACE)
17+
.with_span_events(FmtSpan::EXIT)
818
.finish();
919
tracing::subscriber::set_global_default(subscriber)?;
1020

1121
clients_schema_to_openapi::convert_schema_file(
1222
"../output/schema/schema-no-generics.json",
13-
|e| e.name == "search",
23+
|e| true,
24+
//|e| e.name == "search",
1425
std::io::stdout()
1526
)?;
1627

openapi-converter/clients_schema_to_openapi/src/paths.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,13 @@ use crate::components::TypesAndComponents;
1313
///
1414
pub fn add_endpoint(endpoint: &clients_schema::Endpoint, tac: &mut TypesAndComponents, out: &mut Paths) -> anyhow::Result<()> {
1515

16-
if endpoint.request.is_none() || endpoint.response.is_none() {
17-
tracing::warn!("Endpoint {} is missing either request or response", &endpoint.name);
16+
if endpoint.request.is_none() {
17+
tracing::warn!("Endpoint {} is missing a request -- ignored", &endpoint.name);
18+
return Ok(());
19+
}
20+
21+
if endpoint.response.is_none() {
22+
tracing::warn!("Endpoint {} is missing a response -- ignored", &endpoint.name);
1823
return Ok(());
1924
}
2025

0 commit comments

Comments
 (0)