Skip to content

Commit c8a63be

Browse files
l-trottalcawl
authored andcommitted
Openapi: adding more info in x-state, adding x-state info to fields and params (#4431)
* openapi: adding more info in x-state * getting flavor from config to fix serverless output * x-state in fields * rebase * restore recent changes * addressing review (cherry picked from commit 6998d91)
1 parent 4c35ebc commit c8a63be

File tree

6 files changed

+1311
-908
lines changed

6 files changed

+1311
-908
lines changed

compiler-rs/clients_schema_to_openapi/src/lib.rs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ pub mod cli;
2323

2424
use indexmap::IndexMap;
2525

26-
use clients_schema::{Availabilities, Flavor, IndexedModel, Stability, Visibility};
26+
use clients_schema::{Availabilities, Availability, Flavor, IndexedModel, Stability, Visibility};
2727
use openapiv3::{Components, OpenAPI};
28+
use serde_json::Value;
2829
use clients_schema::transform::ExpandConfig;
2930
use crate::components::TypesAndComponents;
3031

@@ -179,30 +180,37 @@ fn info(model: &IndexedModel) -> openapiv3::Info {
179180
}
180181
}
181182

182-
pub fn availability_as_extensions(availabilities: &Option<Availabilities>) -> IndexMap<String, serde_json::Value> {
183+
pub fn availability_as_extensions(availabilities: &Option<Availabilities>, flavor: &Option<Flavor>) -> IndexMap<String, serde_json::Value> {
183184
let mut result = IndexMap::new();
185+
convert_availabilities(availabilities, flavor, &mut result);
186+
result
187+
}
184188

189+
pub fn convert_availabilities(availabilities: &Option<Availabilities>, flavor: &Option<Flavor>, result: &mut IndexMap<String, Value>) {
185190
if let Some(avails) = availabilities {
186-
// We may have several availabilities, but since generally exists only on stateful (stack)
187-
for (_, availability) in avails {
188-
if let Some(stability) = &availability.stability {
189-
match stability {
191+
if let Some(flav) = flavor {
192+
if let Some(availability) = avails.get(flav) {
193+
let Availability {since,stability,..} = &availability;
194+
let stab = stability.clone().unwrap_or(Stability::Stable);
195+
let mut since_str = "".to_string();
196+
if let Some(since) = since {
197+
since_str = format!("; Added in {since}");
198+
}
199+
match stab {
190200
Stability::Beta => {
191-
result.insert("x-beta".to_string(), serde_json::Value::Bool(true));
201+
let beta_since = format!("Beta{since_str}");
202+
result.insert("x-state".to_string(), Value::String(beta_since));
192203
}
193204
Stability::Experimental => {
194-
result.insert("x-state".to_string(), serde_json::Value::String("Technical preview".to_string()));
205+
let exp_since = format!("Technical preview{since_str}");
206+
result.insert("x-state".to_string(), Value::String(exp_since));
195207
}
196-
Stability::Stable => {
197-
if let Some(since) = &availability.since {
198-
let stable_since = "Added in ".to_string() + since;
199-
result.insert("x-state".to_string(), serde_json::Value::String(stable_since));
200-
}
208+
Stability::Stable => {
209+
let stable_since = format!("Generally available{since_str}");
210+
result.insert("x-state".to_string(), Value::String(stable_since));
201211
}
202212
}
203213
}
204214
}
205215
}
206-
207-
result
208216
}

compiler-rs/clients_schema_to_openapi/src/paths.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,17 @@ use openapiv3::{
2828
MediaType, Parameter, ParameterData, ParameterSchemaOrContent, PathItem, PathStyle, Paths, QueryStyle, ReferenceOr,
2929
RequestBody, Response, Responses, StatusCode, Example
3030
};
31+
use serde_json::Value;
3132
use clients_schema::SchemaExample;
32-
3333
use crate::components::TypesAndComponents;
34+
use crate::convert_availabilities;
3435

3536
/// Add an endpoint to the OpenAPI schema. This will result in the addition of a number of elements to the
3637
/// openapi schema's `paths` and `components` sections.
3738
pub fn add_endpoint(
3839
endpoint: &clients_schema::Endpoint,
3940
tac: &mut TypesAndComponents,
40-
out: &mut Paths,
41+
out: &mut Paths
4142
) -> anyhow::Result<()> {
4243
if endpoint.request.is_none() {
4344
// tracing::warn!("Endpoint {} is missing a request -- ignored", &endpoint.name);
@@ -61,6 +62,8 @@ pub fn add_endpoint(
6162
let request = tac.model.get_request(endpoint.request.as_ref().unwrap())?;
6263

6364
fn parameter_data(prop: &Property, in_path: bool, tac: &mut TypesAndComponents) -> anyhow::Result<ParameterData> {
65+
let mut extensions: IndexMap<String,Value> = Default::default();
66+
convert_availabilities(&prop.availability, &tac.config.flavor, &mut extensions);
6467
Ok(ParameterData {
6568
name: prop.name.clone(),
6669
description: tac.property_description(prop)?,
@@ -341,7 +344,7 @@ pub fn add_endpoint(
341344
};
342345

343346
// add the x-state extension for availability
344-
let mut extensions = crate::availability_as_extensions(&endpoint.availability);
347+
let mut extensions = crate::availability_as_extensions(&endpoint.availability, &tac.config.flavor);
345348

346349
// add the x-codeSamples extension
347350
let mut code_samples = vec![];
@@ -368,6 +371,8 @@ pub fn add_endpoint(
368371
if !code_samples.is_empty() {
369372
extensions.insert("x-codeSamples".to_string(), serde_json::json!(code_samples));
370373
}
374+
let mut ext_availability = crate::availability_as_extensions(&endpoint.availability, &tac.config.flavor);
375+
extensions.append(&mut ext_availability);
371376

372377
// Create the operation, it will be repeated if we have several methods
373378
let operation = openapiv3::Operation {
@@ -392,7 +397,7 @@ pub fn add_endpoint(
392397
deprecated: endpoint.deprecation.is_some(),
393398
security: None,
394399
servers: vec![],
395-
extensions,
400+
extensions
396401
};
397402

398403

compiler-rs/clients_schema_to_openapi/src/schemas.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ impl<'a> TypesAndComponents<'a> {
473473
data.external_docs = self.convert_external_docs(prop);
474474
data.deprecated = prop.deprecation.is_some();
475475
data.description = self.property_description(prop)?;
476-
data.extensions = crate::availability_as_extensions(&prop.availability);
476+
data.extensions = crate::availability_as_extensions(&prop.availability, &self.config.flavor);
477477
// TODO: prop.aliases as extensions
478478
// TODO: prop.server_default as extension
479479
// TODO: prop.doc_id as extension (new representation of since and stability)
Binary file not shown.

0 commit comments

Comments
 (0)