Skip to content

Commit 97a659f

Browse files
lcawll-trotta
andauthored
Openapi: adding more info in x-state, adding x-state info to fields and params (#4431) (#4586)
(cherry picked from commit 6998d91) Co-authored-by: Laura Trotta <[email protected]>
1 parent 15d33b0 commit 97a659f

File tree

6 files changed

+1621
-1217
lines changed

6 files changed

+1621
-1217
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

@@ -157,30 +158,37 @@ fn info(model: &IndexedModel) -> openapiv3::Info {
157158
}
158159
}
159160

160-
pub fn availability_as_extensions(availabilities: &Option<Availabilities>) -> IndexMap<String, serde_json::Value> {
161+
pub fn availability_as_extensions(availabilities: &Option<Availabilities>, flavor: &Option<Flavor>) -> IndexMap<String, serde_json::Value> {
161162
let mut result = IndexMap::new();
163+
convert_availabilities(availabilities, flavor, &mut result);
164+
result
165+
}
162166

167+
pub fn convert_availabilities(availabilities: &Option<Availabilities>, flavor: &Option<Flavor>, result: &mut IndexMap<String, Value>) {
163168
if let Some(avails) = availabilities {
164-
// We may have several availabilities, but since generally exists only on stateful (stack)
165-
for (_, availability) in avails {
166-
if let Some(stability) = &availability.stability {
167-
match stability {
169+
if let Some(flav) = flavor {
170+
if let Some(availability) = avails.get(flav) {
171+
let Availability {since,stability,..} = &availability;
172+
let stab = stability.clone().unwrap_or(Stability::Stable);
173+
let mut since_str = "".to_string();
174+
if let Some(since) = since {
175+
since_str = format!("; Added in {since}");
176+
}
177+
match stab {
168178
Stability::Beta => {
169-
result.insert("x-beta".to_string(), serde_json::Value::Bool(true));
179+
let beta_since = format!("Beta{since_str}");
180+
result.insert("x-state".to_string(), Value::String(beta_since));
170181
}
171182
Stability::Experimental => {
172-
result.insert("x-state".to_string(), serde_json::Value::String("Technical preview".to_string()));
183+
let exp_since = format!("Technical preview{since_str}");
184+
result.insert("x-state".to_string(), Value::String(exp_since));
173185
}
174-
Stability::Stable => {
175-
if let Some(since) = &availability.since {
176-
let stable_since = "Added in ".to_string() + since;
177-
result.insert("x-state".to_string(), serde_json::Value::String(stable_since));
178-
}
186+
Stability::Stable => {
187+
let stable_since = format!("Generally available{since_str}");
188+
result.insert("x-state".to_string(), Value::String(stable_since));
179189
}
180190
}
181191
}
182192
}
183193
}
184-
185-
result
186194
}

compiler-rs/clients_schema_to_openapi/src/paths.rs

Lines changed: 11 additions & 3 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)?,
@@ -320,6 +323,11 @@ pub fn add_endpoint(
320323
(opt_a, opt_b) => opt_a.or(opt_b)
321324
};
322325

326+
// add the x-state extension for availability
327+
let mut extensions = crate::availability_as_extensions(&endpoint.availability, &tac.config.flavor);
328+
let mut ext_availability = crate::availability_as_extensions(&endpoint.availability, &tac.config.flavor);
329+
extensions.append(&mut ext_availability);
330+
323331
// Create the operation, it will be repeated if we have several methods
324332
let operation = openapiv3::Operation {
325333
tags: if let Some(doc_tag) = &endpoint.doc_tag {
@@ -343,7 +351,7 @@ pub fn add_endpoint(
343351
deprecated: endpoint.deprecation.is_some(),
344352
security: None,
345353
servers: vec![],
346-
extensions: crate::availability_as_extensions(&endpoint.availability),
354+
extensions
347355
};
348356

349357

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)