Skip to content

Commit 30c91cd

Browse files
add x-codeSamples to generated OpenAPI
1 parent 7a7e2a2 commit 30c91cd

File tree

4 files changed

+2422
-345
lines changed

4 files changed

+2422
-345
lines changed

compiler-rs/clients_schema_to_openapi/src/paths.rs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ pub fn add_endpoint(
168168
let media = MediaType {
169169
schema: Some(schema),
170170
example: None,
171-
examples: request_examples,
171+
examples: request_examples.clone(),
172172
encoding: Default::default(),
173173
extensions: Default::default(),
174174
};
@@ -198,7 +198,7 @@ pub fn add_endpoint(
198198
// If this endpoint response has examples in schema.json, convert them to the
199199
// OpenAPI format and add them to the endpoint response in the OpenAPI document.
200200
let response_examples = if let Some(examples) = &response_def.examples {
201-
get_openapi_examples(examples)
201+
get_openapi_examples(examples)
202202
} else {
203203
IndexMap::new()
204204
};
@@ -251,6 +251,43 @@ pub fn add_endpoint(
251251

252252
let sum_desc = split_summary_desc(&endpoint.description);
253253

254+
// add the x-state extension for availability
255+
let mut extensions = crate::availability_as_extensions(&endpoint.availability);
256+
257+
// add the x-codeSamples extension
258+
if !request_examples.is_empty() {
259+
let mut code_samples = vec![];
260+
if let Some((_, first_example)) = request_examples.clone().first() {
261+
if let Some(example) = first_example.as_item() {
262+
if let Some(description) = example.description.clone() {
263+
let mut request: Option<String> = Option::None;
264+
for r in description.split('`') {
265+
if r.starts_with("GET ")
266+
|| r.starts_with("POST ")
267+
|| r.starts_with("PUT ")
268+
|| r.starts_with("DELETE ")
269+
|| r.starts_with("HEAD ")
270+
{
271+
request = Some(String::from(r));
272+
break;
273+
}
274+
}
275+
if let Some(first_line) = request {
276+
if let Some(code) = example.value.clone() {
277+
code_samples.push(serde_json::json!({
278+
"lang": "Console",
279+
"source": first_line + "\n" + code.as_str().unwrap_or(""),
280+
}));
281+
}
282+
}
283+
}
284+
}
285+
}
286+
if code_samples.len() > 0 {
287+
extensions.insert("x-codeSamples".to_string(), serde_json::json!(code_samples));
288+
}
289+
}
290+
254291
// Create the operation, it will be repeated if we have several methods
255292
let operation = openapiv3::Operation {
256293
tags: if let Some(doc_tag) = &endpoint.doc_tag {
@@ -274,7 +311,7 @@ pub fn add_endpoint(
274311
deprecated: endpoint.deprecation.is_some(),
275312
security: None,
276313
servers: vec![],
277-
extensions: crate::availability_as_extensions(&endpoint.availability),
314+
extensions,
278315
};
279316

280317

9.16 KB
Binary file not shown.

0 commit comments

Comments
 (0)