@@ -20,12 +20,15 @@ use std::fmt::Write;
2020
2121use anyhow:: { anyhow, bail} ;
2222use clients_schema:: Property ;
23+ use indexmap:: IndexMap ;
2324use indexmap:: indexmap;
2425use icu_segmenter:: SentenceSegmenter ;
2526use openapiv3:: {
2627 MediaType , Parameter , ParameterData , ParameterSchemaOrContent , PathItem , PathStyle , Paths , QueryStyle , ReferenceOr ,
27- RequestBody , Response , Responses , StatusCode ,
28+ RequestBody , Response , Responses , StatusCode , Example
2829} ;
30+ use clients_schema:: SchemaExample ;
31+ use serde_json:: json;
2932
3033use crate :: components:: TypesAndComponents ;
3134
@@ -116,15 +119,42 @@ pub fn add_endpoint(
116119
117120 //---- Prepare request body
118121
122+ // This function converts the IndexMap<String, SchemaExample> examples of
123+ // schema.json to IndexMap<String, ReferenceOr<Example>> which is the format
124+ // that OpenAPI expects.
125+ fn get_openapi_examples ( schema_examples : IndexMap < String , SchemaExample > ) -> IndexMap < String , ReferenceOr < Example > > {
126+ let mut openapi_examples = indexmap ! { } ;
127+ for ( name, schema_example) in schema_examples {
128+ let openapi_example = Example {
129+ value : Some ( json ! ( schema_example. value) ) ,
130+ description : schema_example. description . clone ( ) ,
131+ summary : schema_example. summary . clone ( ) ,
132+ external_value : None ,
133+ extensions : Default :: default ( ) ,
134+ } ;
135+ openapi_examples. insert ( name. clone ( ) , ReferenceOr :: Item ( openapi_example) ) ;
136+ }
137+ return openapi_examples;
138+ }
139+
140+
141+ let mut request_examples: IndexMap < String , ReferenceOr < Example > > = indexmap ! { } ;
142+ // If this endpoint request has examples in schema.json, convert them to the
143+ // OpenAPI format and add them to the endpoint request in the OpenAPI document.
144+ if request. examples . is_some ( ) {
145+ request_examples = get_openapi_examples ( request. examples . as_ref ( ) . unwrap ( ) . clone ( ) ) ;
146+ }
147+
119148 let request_body = tac. convert_request ( request) ?. map ( |schema| {
120149 let media = MediaType {
121150 schema : Some ( schema) ,
122151 example : None ,
123- examples : Default :: default ( ) ,
152+ examples : request_examples ,
124153 encoding : Default :: default ( ) ,
125154 extensions : Default :: default ( ) ,
126155 } ;
127156
157+
128158 let body = RequestBody {
129159 description : None ,
130160 // FIXME: nd-json requests
@@ -142,17 +172,24 @@ pub fn add_endpoint(
142172
143173 //---- Prepare request responses
144174
175+
145176 // FIXME: buggy for responses with no body
146177 // TODO: handle binary responses
147178 let response_def = tac. model . get_response ( endpoint. response . as_ref ( ) . unwrap ( ) ) ?;
179+ let mut response_examples: IndexMap < String , ReferenceOr < Example > > = indexmap ! { } ;
180+ // If this endpoint response has examples in schema.json, convert them to the
181+ // OpenAPI format and add them to the endpoint response in the OpenAPI document.
182+ if response_def. examples . is_some ( ) {
183+ response_examples = get_openapi_examples ( response_def. examples . as_ref ( ) . unwrap ( ) . clone ( ) ) ;
184+ }
148185 let response = Response {
149186 description : "" . to_string ( ) ,
150187 headers : Default :: default ( ) ,
151188 content : indexmap ! {
152189 "application/json" . to_string( ) => MediaType {
153190 schema: tac. convert_response( response_def) ?,
154191 example: None ,
155- examples: Default :: default ( ) ,
192+ examples: response_examples ,
156193 encoding: Default :: default ( ) ,
157194 extensions: Default :: default ( ) ,
158195 }
0 commit comments