Skip to content

Commit 6998d91

Browse files
authored
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
1 parent 9e631d8 commit 6998d91

File tree

6 files changed

+1416
-1013
lines changed

6 files changed

+1416
-1013
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

@@ -149,30 +150,37 @@ fn info(model: &IndexedModel) -> openapiv3::Info {
149150
}
150151
}
151152

152-
pub fn availability_as_extensions(availabilities: &Option<Availabilities>) -> IndexMap<String, serde_json::Value> {
153+
pub fn availability_as_extensions(availabilities: &Option<Availabilities>, flavor: &Option<Flavor>) -> IndexMap<String, serde_json::Value> {
153154
let mut result = IndexMap::new();
155+
convert_availabilities(availabilities, flavor, &mut result);
156+
result
157+
}
154158

159+
pub fn convert_availabilities(availabilities: &Option<Availabilities>, flavor: &Option<Flavor>, result: &mut IndexMap<String, Value>) {
155160
if let Some(avails) = availabilities {
156-
// We may have several availabilities, but since generally exists only on stateful (stack)
157-
for (_, availability) in avails {
158-
if let Some(stability) = &availability.stability {
159-
match stability {
161+
if let Some(flav) = flavor {
162+
if let Some(availability) = avails.get(flav) {
163+
let Availability {since,stability,..} = &availability;
164+
let stab = stability.clone().unwrap_or(Stability::Stable);
165+
let mut since_str = "".to_string();
166+
if let Some(since) = since {
167+
since_str = format!("; Added in {since}");
168+
}
169+
match stab {
160170
Stability::Beta => {
161-
result.insert("x-beta".to_string(), serde_json::Value::Bool(true));
171+
let beta_since = format!("Beta{since_str}");
172+
result.insert("x-state".to_string(), Value::String(beta_since));
162173
}
163174
Stability::Experimental => {
164-
result.insert("x-state".to_string(), serde_json::Value::String("Technical preview".to_string()));
175+
let exp_since = format!("Technical preview{since_str}");
176+
result.insert("x-state".to_string(), Value::String(exp_since));
165177
}
166-
Stability::Stable => {
167-
if let Some(since) = &availability.since {
168-
let stable_since = "Added in ".to_string() + since;
169-
result.insert("x-state".to_string(), serde_json::Value::String(stable_since));
170-
}
178+
Stability::Stable => {
179+
let stable_since = format!("Generally available{since_str}");
180+
result.insert("x-state".to_string(), Value::String(stable_since));
171181
}
172182
}
173183
}
174184
}
175185
}
176-
177-
result
178186
}

compiler-rs/clients_schema_to_openapi/src/paths.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,25 @@ use std::collections::HashMap;
1919
use std::fmt::Write;
2020

2121
use anyhow::{anyhow, bail};
22-
use clients_schema::Property;
22+
use clients_schema::{Property};
2323
use indexmap::IndexMap;
2424
use indexmap::indexmap;
2525
use icu_segmenter::SentenceSegmenter;
2626
use openapiv3::{
2727
MediaType, Parameter, ParameterData, ParameterSchemaOrContent, PathItem, PathStyle, Paths, QueryStyle, ReferenceOr,
2828
RequestBody, Response, Responses, StatusCode, Example
2929
};
30+
use serde_json::Value;
3031
use clients_schema::SchemaExample;
31-
3232
use crate::components::TypesAndComponents;
33+
use crate::convert_availabilities;
3334

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

6263
fn parameter_data(prop: &Property, in_path: bool, tac: &mut TypesAndComponents) -> anyhow::Result<ParameterData> {
64+
let mut extensions: IndexMap<String,Value> = Default::default();
65+
convert_availabilities(&prop.availability, &tac.config.flavor, &mut extensions);
6366
Ok(ParameterData {
6467
name: prop.name.clone(),
6568
description: tac.property_description(prop)?,
@@ -252,7 +255,7 @@ pub fn add_endpoint(
252255
let sum_desc = split_summary_desc(&endpoint.description);
253256

254257
// add the x-state extension for availability
255-
let mut extensions = crate::availability_as_extensions(&endpoint.availability);
258+
let mut extensions = crate::availability_as_extensions(&endpoint.availability, &tac.config.flavor);
256259

257260
// add the x-codeSamples extension
258261
let mut code_samples = vec![];
@@ -286,6 +289,8 @@ pub fn add_endpoint(
286289
if !code_samples.is_empty() {
287290
extensions.insert("x-codeSamples".to_string(), serde_json::json!(code_samples));
288291
}
292+
let mut ext_availability = crate::availability_as_extensions(&endpoint.availability, &tac.config.flavor);
293+
extensions.append(&mut ext_availability);
289294

290295
// Create the operation, it will be repeated if we have several methods
291296
let operation = openapiv3::Operation {
@@ -310,7 +315,7 @@ pub fn add_endpoint(
310315
deprecated: endpoint.deprecation.is_some(),
311316
security: None,
312317
servers: vec![],
313-
extensions,
318+
extensions
314319
};
315320

316321

compiler-rs/clients_schema_to_openapi/src/schemas.rs

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

0 commit comments

Comments
 (0)