@@ -28,7 +28,6 @@ use openapiv3::{
2828 RequestBody , Response , Responses , StatusCode , Example
2929} ;
3030use clients_schema:: SchemaExample ;
31- use serde_json:: json;
3231
3332use crate :: components:: TypesAndComponents ;
3433
@@ -122,28 +121,40 @@ pub fn add_endpoint(
122121 // This function converts the IndexMap<String, SchemaExample> examples of
123122 // schema.json to IndexMap<String, ReferenceOr<Example>> which is the format
124123 // that OpenAPI expects.
125- fn get_openapi_examples ( schema_examples : IndexMap < String , SchemaExample > ) -> IndexMap < String , ReferenceOr < Example > > {
124+ fn get_openapi_examples ( schema_examples : & IndexMap < String , SchemaExample > ) -> IndexMap < String , ReferenceOr < Example > > {
126125 let mut openapi_examples = indexmap ! { } ;
127126 for ( name, schema_example) in schema_examples {
127+ let example = match & schema_example. value {
128+ None => None ,
129+ Some ( text) => {
130+ match serde_json:: from_str :: < serde_json:: Value > ( & text) {
131+ Ok ( json) => Some ( json) ,
132+ // Cannot parse json: assume it's text (e.g. cat requests)
133+ // FIXME: should be validated by looking at the media-type
134+ Err ( _) => Some ( serde_json:: Value :: String ( text. clone ( ) ) )
135+ }
136+ }
137+ } ;
138+
128139 let openapi_example = Example {
129- value : Some ( json ! ( schema_example . value ) ) ,
140+ value : example ,
130141 description : schema_example. description . clone ( ) ,
131142 summary : schema_example. summary . clone ( ) ,
132143 external_value : None ,
133144 extensions : Default :: default ( ) ,
134145 } ;
135146 openapi_examples. insert ( name. clone ( ) , ReferenceOr :: Item ( openapi_example) ) ;
136147 }
137- return openapi_examples;
148+ openapi_examples
138149 }
139150
140-
141- let mut request_examples: IndexMap < String , ReferenceOr < Example > > = indexmap ! { } ;
142151 // If this endpoint request has examples in schema.json, convert them to the
143152 // 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- }
153+ let request_examples = if let Some ( examples) = & request. examples {
154+ get_openapi_examples ( examples)
155+ } else {
156+ IndexMap :: new ( )
157+ } ;
147158
148159 let request_body = tac. convert_request ( request) ?. map ( |schema| {
149160 let media = MediaType {
@@ -176,12 +187,13 @@ pub fn add_endpoint(
176187 // FIXME: buggy for responses with no body
177188 // TODO: handle binary responses
178189 let response_def = tac. model . get_response ( endpoint. response . as_ref ( ) . unwrap ( ) ) ?;
179- let mut response_examples: IndexMap < String , ReferenceOr < Example > > = indexmap ! { } ;
180190 // If this endpoint response has examples in schema.json, convert them to the
181191 // 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- }
192+ let response_examples = if let Some ( examples) = & response_def. examples {
193+ get_openapi_examples ( examples)
194+ } else {
195+ IndexMap :: new ( )
196+ } ;
185197 let response = Response {
186198 description : "" . to_string ( ) ,
187199 headers : Default :: default ( ) ,
0 commit comments