Skip to content

Commit 3d561e6

Browse files
Add request details to examples (#4445)
* add request heading line to request examples * add request heading line to response examples * changes to the compiler to include the request heading
1 parent 968a9d6 commit 3d561e6

File tree

538 files changed

+5875
-1126
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

538 files changed

+5875
-1126
lines changed

compiler-rs/clients_schema/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,7 @@ impl TypeDefinition {
494494
#[derive(Debug, Clone, Serialize, Deserialize)]
495495
pub struct SchemaExample {
496496
pub summary: Option<String>,
497+
pub method_request: Option<String>,
497498
pub description: Option<String>,
498499
pub value: Option<String>,
499500
pub external_value: Option<String>,

compiler-rs/clients_schema_to_openapi/src/paths.rs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ pub fn add_endpoint(
202202
// If this endpoint response has examples in schema.json, convert them to the
203203
// OpenAPI format and add them to the endpoint response in the OpenAPI document.
204204
let response_examples = if let Some(examples) = &response_def.examples {
205-
get_openapi_examples(examples)
205+
get_openapi_examples(examples)
206206
} else {
207207
IndexMap::new()
208208
};
@@ -343,8 +343,39 @@ pub fn add_endpoint(
343343

344344
// add the x-state extension for availability
345345
let mut extensions = crate::availability_as_extensions(&endpoint.availability, &tac.config.flavor);
346-
let mut ext_availability = crate::availability_as_extensions(&endpoint.availability, &tac.config.flavor);
347-
extensions.append(&mut ext_availability);
346+
347+
// add the x-codeSamples extension
348+
let mut code_samples = vec![];
349+
if let Some(examples) = request.examples.clone() {
350+
if let Some((_, example)) = examples.first() {
351+
let request_line = example.method_request.clone().unwrap_or(String::from(""));
352+
let request_body = example.value.clone().unwrap_or(String::from(""));
353+
if !request_line.is_empty() {
354+
code_samples.push(serde_json::json!({
355+
"lang": "Console",
356+
"source": request_line + "\n" + request_body.as_str(),
357+
}));
358+
}
359+
}
360+
}
361+
if code_samples.is_empty() {
362+
// if there are no example requests we look for example responses
363+
// this can only happen for examples that do not have a request body
364+
if let Some(examples) = response_def.examples.clone() {
365+
if let Some((_, example)) = examples.first() {
366+
let request_line = example.method_request.clone().unwrap_or(String::from(""));
367+
if !request_line.is_empty() {
368+
code_samples.push(serde_json::json!({
369+
"lang": "Console",
370+
"source": request_line + "\n",
371+
}));
372+
}
373+
}
374+
}
375+
}
376+
if !code_samples.is_empty() {
377+
extensions.insert("x-codeSamples".to_string(), serde_json::json!(code_samples));
378+
}
348379

349380
// Create the operation, it will be repeated if we have several methods
350381
let operation = openapiv3::Operation {
@@ -369,7 +400,7 @@ pub fn add_endpoint(
369400
deprecated: endpoint.deprecation.is_some(),
370401
security: None,
371402
servers: vec![],
372-
extensions
403+
extensions,
373404
};
374405

375406

Binary file not shown.

compiler/src/model/metamodel.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,8 @@ export class Example {
271271
summary?: string
272272
/** Long description. */
273273
description?: string
274+
/** request method and URL */
275+
method_request?: string
274276
/** Embedded literal example. Mutually exclusive with `external_value` */
275277
value?: string
276278
/** A URI that points to the literal example */

0 commit comments

Comments
 (0)