[Rust] rename rust2 to rust-server (#6747)

* rename rust2 to rust-server

* update rust-server batch file to use petstore test spec
This commit is contained in:
wing328 2017-10-19 20:17:08 +08:00 committed by GitHub
parent 3472c68e0b
commit f0b7daeec6
39 changed files with 237 additions and 172 deletions

View File

@ -25,7 +25,7 @@
This is the swagger codegen project, which allows generation of API client libraries (SDK generation), server stubs and documentation automatically given an [OpenAPI Spec](https://github.com/OAI/OpenAPI-Specification). Currently, the following languages/frameworks are supported: This is the swagger codegen project, which allows generation of API client libraries (SDK generation), server stubs and documentation automatically given an [OpenAPI Spec](https://github.com/OAI/OpenAPI-Specification). Currently, the following languages/frameworks are supported:
- **API clients**: **ActionScript**, **Ada**, **Apex**, **Bash**, **C#** (.net 2.0, 4.0 or later), **C++** (cpprest, Qt5, Tizen), **Clojure**, **Dart**, **Elixir**, **Eiffel**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx), **Kotlin**, **Lua**, **Node.js** (ES5, ES6, AngularJS with Google Closure Compiler annotations) **Objective-C**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust**, **Scala** (akka, http4s, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (Angular1.x, Angular2.x, Fetch, jQuery, Node) - **API clients**: **ActionScript**, **Ada**, **Apex**, **Bash**, **C#** (.net 2.0, 4.0 or later), **C++** (cpprest, Qt5, Tizen), **Clojure**, **Dart**, **Elixir**, **Eiffel**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx), **Kotlin**, **Lua**, **Node.js** (ES5, ES6, AngularJS with Google Closure Compiler annotations) **Objective-C**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust**, **Scala** (akka, http4s, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (Angular1.x, Angular2.x, Fetch, jQuery, Node)
- **Server stubs**: **C#** (ASP.NET Core, NancyFx), **C++** (Pistache, Restbed), **Erlang**, **Go**, **Haskell** (Servant), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework), **PHP** (Lumen, Slim, Silex, [Symfony](https://symfony.com/), [Zend Expressive](https://github.com/zendframework/zend-expressive)), **Python** (Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Scala** ([Finch](https://github.com/finagle/finch), Scalatra) - **Server stubs**: **C#** (ASP.NET Core, NancyFx), **C++** (Pistache, Restbed), **Erlang**, **Go**, **Haskell** (Servant), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework), **PHP** (Lumen, Slim, Silex, [Symfony](https://symfony.com/), [Zend Expressive](https://github.com/zendframework/zend-expressive)), **Python** (Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust**, **Scala** ([Finch](https://github.com/finagle/finch), Scalatra)
- **API documentation generators**: **HTML**, **Confluence Wiki** - **API documentation generators**: **HTML**, **Confluence Wiki**
- **Configuration files**: [**Apache2**](https://httpd.apache.org/) - **Configuration files**: [**Apache2**](https://httpd.apache.org/)
- **Others**: **JMeter** - **Others**: **JMeter**

View File

@ -26,6 +26,6 @@ fi
# if you've executed sbt assembly previously it will use that instead. # if you've executed sbt assembly previously it will use that instead.
export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties"
ags="$@ generate -t modules/swagger-codegen/src/main/resources/rust2 -i modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -l rust2 -o samples/client/petstore/rust2 -DpackageName=petstore_api" ags="$@ generate -t modules/swagger-codegen/src/main/resources/rust-server -i modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -l rust-server -o samples/server/petstore/rust-server -DpackageName=petstore_api"
java $JAVA_OPTS -jar $executable $ags java $JAVA_OPTS -jar $executable $ags

View File

@ -0,0 +1,10 @@
set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar
If Not Exist %executable% (
mvn clean package
)
REM set JAVA_OPTS=%JAVA_OPTS% -Xmx1024M -DloggerPath=conf/log4j.properties
set ags=generate -i modules\swagger-codegen\src\test\resources\2_0\petstore-with-fake-endpoints-models-for-testing.yaml -l rust-server -o samples\server\petstore\rust-server
java %JAVA_OPTS% -jar %executable% %ags%

View File

@ -27,25 +27,25 @@ import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
public class Rust2Codegen extends DefaultCodegen implements CodegenConfig { public class RustServerCodegen extends DefaultCodegen implements CodegenConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(Rust2Codegen.class); private static final Logger LOGGER = LoggerFactory.getLogger(RustServerCodegen.class);
private HashMap<String, String> modelXmlNames = new HashMap<String, String>(); private HashMap<String, String> modelXmlNames = new HashMap<String, String>();
protected String apiVersion = "1.0.0"; protected String apiVersion = "1.0.0";
protected int serverPort = 8080; protected int serverPort = 8080;
protected String projectName = "swagger-server"; protected String projectName = "swagger-server";
protected String apiPath = "rust2"; protected String apiPath = "rust-server";
protected String packageName; protected String packageName;
protected String packageVersion; protected String packageVersion;
protected String externCrateName; protected String externCrateName;
public Rust2Codegen() { public RustServerCodegen() {
super(); super();
// set the output folder here // set the output folder here
outputFolder = "generated-code/rust2"; outputFolder = "generated-code/rust-server";
/* /*
* Models. You can write model files using the modelTemplateFiles map. * Models. You can write model files using the modelTemplateFiles map.
@ -66,7 +66,7 @@ public class Rust2Codegen extends DefaultCodegen implements CodegenConfig {
* Template Location. This is the location which templates will be read from. The generator * Template Location. This is the location which templates will be read from. The generator
* will use the resource stream to attempt to read the templates. * will use the resource stream to attempt to read the templates.
*/ */
embeddedTemplateDir = templateDir = "rust2"; embeddedTemplateDir = templateDir = "rust-server";
/* /*
* Reserved words. Override this with reserved words specific to your language * Reserved words. Override this with reserved words specific to your language
@ -232,7 +232,7 @@ public class Rust2Codegen extends DefaultCodegen implements CodegenConfig {
*/ */
@Override @Override
public String getName() { public String getName() {
return "rust2"; return "rust-server";
} }
/** /**
@ -243,7 +243,7 @@ public class Rust2Codegen extends DefaultCodegen implements CodegenConfig {
*/ */
@Override @Override
public String getHelp() { public String getHelp() {
return "Generates a Rust client/server library using the swagger-codegen project."; return "Generates a Rust client/server library (beta) using the swagger-codegen project.";
} }
@Override @Override

View File

@ -55,8 +55,8 @@ io.swagger.codegen.languages.RClientCodegen
io.swagger.codegen.languages.Rails5ServerCodegen io.swagger.codegen.languages.Rails5ServerCodegen
io.swagger.codegen.languages.RestbedCodegen io.swagger.codegen.languages.RestbedCodegen
io.swagger.codegen.languages.RubyClientCodegen io.swagger.codegen.languages.RubyClientCodegen
io.swagger.codegen.languages.Rust2Codegen
io.swagger.codegen.languages.RustClientCodegen io.swagger.codegen.languages.RustClientCodegen
io.swagger.codegen.languages.RustServerCodegen
io.swagger.codegen.languages.ScalaClientCodegen io.swagger.codegen.languages.ScalaClientCodegen
io.swagger.codegen.languages.ScalatraServerCodegen io.swagger.codegen.languages.ScalatraServerCodegen
io.swagger.codegen.languages.ScalazClientCodegen io.swagger.codegen.languages.ScalazClientCodegen

View File

@ -13,7 +13,7 @@ To see how to make this your own, look here:
[README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md) [README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md)
- API version: 1.0.0 - API version: 1.0.0
- Build date: 2017-09-26T16:36:55.563+01:00 - Build date: 2017-10-19T17:45:37.995+08:00
## Examples ## Examples
@ -50,6 +50,7 @@ cargo run --example client FakeOuterStringSerialize
cargo run --example client TestClientModel cargo run --example client TestClientModel
cargo run --example client TestEndpointParameters cargo run --example client TestEndpointParameters
cargo run --example client TestEnumParameters cargo run --example client TestEnumParameters
cargo run --example client TestInlineAdditionalProperties
cargo run --example client TestJsonFormData cargo run --example client TestJsonFormData
cargo run --example client TestClassname cargo run --example client TestClassname
cargo run --example client AddPet cargo run --example client AddPet

View File

@ -10,7 +10,7 @@ info:
contact: contact:
email: "apiteam@swagger.io" email: "apiteam@swagger.io"
license: license:
name: "Apache 2.0" name: "Apache-2.0"
url: "http://www.apache.org/licenses/LICENSE-2.0.html" url: "http://www.apache.org/licenses/LICENSE-2.0.html"
host: "petstore.swagger.io:80" host: "petstore.swagger.io:80"
basePath: "/v2" basePath: "/v2"
@ -54,7 +54,7 @@ paths:
refName: "Pet" refName: "Pet"
formatString: "{:?}" formatString: "{:?}"
example: "???" example: "???"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "ADD_PET" uppercase_operation_id: "ADD_PET"
consumesXml: true consumesXml: true
responses: responses:
@ -95,7 +95,7 @@ paths:
refName: "Pet" refName: "Pet"
formatString: "{:?}" formatString: "{:?}"
example: "???" example: "???"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "UPDATE_PET" uppercase_operation_id: "UPDATE_PET"
consumesXml: true consumesXml: true
responses: responses:
@ -450,7 +450,7 @@ paths:
refName: "Order" refName: "Order"
formatString: "{:?}" formatString: "{:?}"
example: "???" example: "???"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "PLACE_ORDER" uppercase_operation_id: "PLACE_ORDER"
responses: responses:
200: 200:
@ -568,7 +568,7 @@ paths:
refName: "User" refName: "User"
formatString: "{:?}" formatString: "{:?}"
example: "???" example: "???"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "CREATE_USER" uppercase_operation_id: "CREATE_USER"
responses: responses:
default: default:
@ -602,7 +602,7 @@ paths:
$ref: "#/definitions/User" $ref: "#/definitions/User"
formatString: "{:?}" formatString: "{:?}"
example: "&Vec::new()" example: "&Vec::new()"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "CREATE_USERS_WITH_ARRAY_INPUT" uppercase_operation_id: "CREATE_USERS_WITH_ARRAY_INPUT"
responses: responses:
default: default:
@ -635,7 +635,7 @@ paths:
$ref: "#/definitions/User" $ref: "#/definitions/User"
formatString: "{:?}" formatString: "{:?}"
example: "&Vec::new()" example: "&Vec::new()"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "CREATE_USERS_WITH_LIST_INPUT" uppercase_operation_id: "CREATE_USERS_WITH_LIST_INPUT"
responses: responses:
default: default:
@ -787,7 +787,7 @@ paths:
refName: "User" refName: "User"
formatString: "{:?}" formatString: "{:?}"
example: "???" example: "???"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "UPDATE_USER" uppercase_operation_id: "UPDATE_USER"
responses: responses:
400: 400:
@ -856,7 +856,7 @@ paths:
refName: "Client" refName: "Client"
formatString: "{:?}" formatString: "{:?}"
example: "???" example: "???"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "TEST_CLASSNAME" uppercase_operation_id: "TEST_CLASSNAME"
responses: responses:
200: 200:
@ -1169,7 +1169,7 @@ paths:
refName: "Client" refName: "Client"
formatString: "{:?}" formatString: "{:?}"
example: "???" example: "???"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "TEST_CLIENT_MODEL" uppercase_operation_id: "TEST_CLIENT_MODEL"
responses: responses:
200: 200:
@ -1202,7 +1202,7 @@ paths:
refName: "OuterNumber" refName: "OuterNumber"
formatString: "{:?}" formatString: "{:?}"
example: "None" example: "None"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "FAKE_OUTER_NUMBER_SERIALIZE" uppercase_operation_id: "FAKE_OUTER_NUMBER_SERIALIZE"
responses: responses:
200: 200:
@ -1234,7 +1234,7 @@ paths:
refName: "OuterString" refName: "OuterString"
formatString: "{:?}" formatString: "{:?}"
example: "None" example: "None"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "FAKE_OUTER_STRING_SERIALIZE" uppercase_operation_id: "FAKE_OUTER_STRING_SERIALIZE"
responses: responses:
200: 200:
@ -1266,7 +1266,7 @@ paths:
refName: "OuterBoolean" refName: "OuterBoolean"
formatString: "{:?}" formatString: "{:?}"
example: "None" example: "None"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "FAKE_OUTER_BOOLEAN_SERIALIZE" uppercase_operation_id: "FAKE_OUTER_BOOLEAN_SERIALIZE"
responses: responses:
200: 200:
@ -1298,7 +1298,7 @@ paths:
refName: "OuterComposite" refName: "OuterComposite"
formatString: "{:?}" formatString: "{:?}"
example: "None" example: "None"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "FAKE_OUTER_COMPOSITE_SERIALIZE" uppercase_operation_id: "FAKE_OUTER_COMPOSITE_SERIALIZE"
responses: responses:
200: 200:
@ -1365,7 +1365,6 @@ paths:
uppercase_message: "SUCCESS" uppercase_message: "SUCCESS"
uppercase_data_type: "XMLOBJECT" uppercase_data_type: "XMLOBJECT"
producesXml: true producesXml: true
has_namespace: "true"
operation_id: "get_xml_features" operation_id: "get_xml_features"
uppercase_operation_id: "GET_XML_FEATURES" uppercase_operation_id: "GET_XML_FEATURES"
path: "/fake/xmlFeatures" path: "/fake/xmlFeatures"
@ -1388,8 +1387,7 @@ paths:
refName: "xmlObject" refName: "xmlObject"
formatString: "{:?}" formatString: "{:?}"
example: "???" example: "???"
has_namespace: "true" model_key: "OuterBoolean"
model_key: "itemList"
uppercase_operation_id: "POST_XML_FEATURES" uppercase_operation_id: "POST_XML_FEATURES"
consumesXml: true consumesXml: true
responses: responses:
@ -1403,6 +1401,41 @@ paths:
HttpMethod: "Post" HttpMethod: "Post"
httpmethod: "post" httpmethod: "post"
noClientExample: true noClientExample: true
/fake/inline-additionalProperties:
post:
tags:
- "fake"
summary: "test inline additionalProperties"
description: ""
operationId: "testInlineAdditionalProperties"
consumes:
- "application/json"
parameters:
- in: "body"
name: "param"
description: "request body"
required: true
schema:
type: "object"
additionalProperties:
type: "string"
upperCaseName: "PARAM"
refName: null
formatString: "{:?}"
example: "???"
model_key: "OuterBoolean"
uppercase_operation_id: "TEST_INLINE_ADDITIONAL_PROPERTIES"
responses:
200:
description: "successful operation"
uppercase_operation_id: "TEST_INLINE_ADDITIONAL_PROPERTIES"
uppercase_message: "SUCCESSFUL_OPERATION"
operation_id: "test_inline_additional_properties"
uppercase_operation_id: "TEST_INLINE_ADDITIONAL_PROPERTIES"
path: "/fake/inline-additionalProperties"
HttpMethod: "Post"
httpmethod: "post"
noClientExample: true
/another-fake/dummy: /another-fake/dummy:
patch: patch:
tags: tags:
@ -1425,7 +1458,7 @@ paths:
refName: "Client" refName: "Client"
formatString: "{:?}" formatString: "{:?}"
example: "???" example: "???"
model_key: "itemList" model_key: "OuterBoolean"
uppercase_operation_id: "TEST_SPECIAL_TAGS" uppercase_operation_id: "TEST_SPECIAL_TAGS"
responses: responses:
200: 200:
@ -1968,15 +2001,6 @@ definitions:
- "approved" - "approved"
- "delivered" - "delivered"
upperCaseName: "OUTERENUM" upperCaseName: "OUTERENUM"
OuterNumber:
type: "number"
upperCaseName: "OUTERNUMBER"
OuterString:
type: "string"
upperCaseName: "OUTERSTRING"
OuterBoolean:
type: "boolean"
upperCaseName: "OUTERBOOLEAN"
OuterComposite: OuterComposite:
type: "object" type: "object"
properties: properties:
@ -1991,30 +2015,15 @@ definitions:
my_number: {} my_number: {}
my_boolean: {} my_boolean: {}
upperCaseName: "OUTERCOMPOSITE" upperCaseName: "OUTERCOMPOSITE"
xmlObject: OuterNumber:
required: type: "number"
- "itemList" upperCaseName: "OUTERNUMBER"
- "name" OuterString:
properties: type: "string"
name: upperCaseName: "OUTERSTRING"
type: "string" OuterBoolean:
example: "myXmlObject" type: "boolean"
itemList: upperCaseName: "OUTERBOOLEAN"
$ref: "#/definitions/itemList"
itemXmlName: "item"
xml:
name: "group"
namespace: "http://example.com/schema.xsd"
upperCaseName: "XMLOBJECT"
itemList:
type: "array"
items:
type: "string"
example: "my item"
xml:
name: "item"
upperCaseName: "ITEMLIST"
itemXmlName: "item"
externalDocs: externalDocs:
description: "Find out more about Swagger" description: "Find out more about Swagger"
url: "http://swagger.io" url: "http://swagger.io"

View File

@ -24,6 +24,7 @@ use petstore_api::{ApiNoContext, ContextWrapperExt,
TestClientModelResponse, TestClientModelResponse,
TestEndpointParametersResponse, TestEndpointParametersResponse,
TestEnumParametersResponse, TestEnumParametersResponse,
TestInlineAdditionalPropertiesResponse,
TestJsonFormDataResponse, TestJsonFormDataResponse,
TestClassnameResponse, TestClassnameResponse,
AddPetResponse, AddPetResponse,
@ -151,6 +152,12 @@ fn main() {
println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from("<none>"))); println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from("<none>")));
}, },
// Disabled because there's no example.
// Some("TestInlineAdditionalProperties") => {
// let result = client.test_inline_additional_properties(???).wait();
// println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from("<none>")));
// },
Some("TestJsonFormData") => { Some("TestJsonFormData") => {
let result = client.test_json_form_data("param_example".to_string(), "param2_example".to_string()).wait(); let result = client.test_json_form_data("param_example".to_string(), "param2_example".to_string()).wait();
println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from("<none>"))); println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from("<none>")));

View File

@ -20,6 +20,7 @@ use petstore_api::{Api, ApiError, Context,
TestClientModelResponse, TestClientModelResponse,
TestEndpointParametersResponse, TestEndpointParametersResponse,
TestEnumParametersResponse, TestEnumParametersResponse,
TestInlineAdditionalPropertiesResponse,
TestJsonFormDataResponse, TestJsonFormDataResponse,
TestClassnameResponse, TestClassnameResponse,
AddPetResponse, AddPetResponse,
@ -121,6 +122,13 @@ impl Api for Server {
Box::new(futures::failed("Generic failure".into())) Box::new(futures::failed("Generic failure".into()))
} }
/// test inline additionalProperties
fn test_inline_additional_properties(&self, param: object, context: &Context) -> Box<Future<Item=TestInlineAdditionalPropertiesResponse, Error=ApiError> + Send> {
let context = context.clone();
println!("test_inline_additional_properties({:?}) - X-Span-ID: {:?}", param, context.x_span_id.unwrap_or(String::from("<none>")).clone());
Box::new(futures::failed("Generic failure".into()))
}
/// test json serialization of form data /// test json serialization of form data
fn test_json_form_data(&self, param: String, param2: String, context: &Context) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send> { fn test_json_form_data(&self, param: String, param2: String, context: &Context) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send> {
let context = context.clone(); let context = context.clone();

View File

@ -45,6 +45,7 @@ use {Api,
TestClientModelResponse, TestClientModelResponse,
TestEndpointParametersResponse, TestEndpointParametersResponse,
TestEnumParametersResponse, TestEnumParametersResponse,
TestInlineAdditionalPropertiesResponse,
TestJsonFormDataResponse, TestJsonFormDataResponse,
TestClassnameResponse, TestClassnameResponse,
AddPetResponse, AddPetResponse,
@ -307,11 +308,7 @@ impl Api for Client {
let url = format!("{}/v2/fake/xmlFeatures?", self.base_path); let url = format!("{}/v2/fake/xmlFeatures?", self.base_path);
let body = serde_xml_rs::to_string(&param_xml_object).expect("impossible to fail to serialize");
let mut namespaces = BTreeMap::new();
// An empty string is used to indicate a global namespace in xmltree.
namespaces.insert("".to_string(), models::namespaces::XMLOBJECT.clone());
let body = serde_xml_rs::to_string_with_namespaces(&param_xml_object, namespaces).expect("impossible to fail to serialize");
let hyper_client = (self.hyper_client)(); let hyper_client = (self.hyper_client)();
let request = hyper_client.request(hyper::method::Method::Post, &url); let request = hyper_client.request(hyper::method::Method::Post, &url);
@ -744,6 +741,55 @@ impl Api for Client {
Box::new(futures::done(result)) Box::new(futures::done(result))
} }
fn test_inline_additional_properties(&self, param_param: object, context: &Context) -> Box<Future<Item=TestInlineAdditionalPropertiesResponse, Error=ApiError> + Send> {
let url = format!("{}/v2/fake/inline-additionalProperties?", self.base_path);
let body = serde_json::to_string(&param_param).expect("impossible to fail to serialize");
let hyper_client = (self.hyper_client)();
let request = hyper_client.request(hyper::method::Method::Post, &url);
let mut custom_headers = hyper::header::Headers::new();
let request = request.body(&body);
custom_headers.set(ContentType(mimetypes::requests::TEST_INLINE_ADDITIONAL_PROPERTIES.clone()));
context.x_span_id.as_ref().map(|header| custom_headers.set(XSpanId(header.clone())));
let request = request.headers(custom_headers);
// Helper function to provide a code block to use `?` in (to be replaced by the `catch` block when it exists).
fn parse_response(mut response: hyper::client::response::Response) -> Result<TestInlineAdditionalPropertiesResponse, ApiError> {
match response.status.to_u16() {
200 => {
Ok(TestInlineAdditionalPropertiesResponse::SuccessfulOperation)
},
code => {
let mut buf = [0; 100];
let debug_body = match response.read(&mut buf) {
Ok(len) => match str::from_utf8(&buf[..len]) {
Ok(body) => Cow::from(body),
Err(_) => Cow::from(format!("<Body was not UTF8: {:?}>", &buf[..len].to_vec())),
},
Err(e) => Cow::from(format!("<Failed to read body: {}>", e)),
};
Err(ApiError(format!("Unexpected response code {}:\n{:?}\n\n{}",
code,
response.headers,
debug_body)))
}
}
}
let result = request.send().map_err(|e| ApiError(format!("No response received: {}", e))).and_then(parse_response);
Box::new(futures::done(result))
}
fn test_json_form_data(&self, param_param: String, param_param2: String, context: &Context) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send> { fn test_json_form_data(&self, param_param: String, param_param2: String, context: &Context) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send> {

View File

@ -85,6 +85,11 @@ pub enum TestEnumParametersResponse {
NotFound , NotFound ,
} }
#[derive(Debug, PartialEq)]
pub enum TestInlineAdditionalPropertiesResponse {
SuccessfulOperation ,
}
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub enum TestJsonFormDataResponse { pub enum TestJsonFormDataResponse {
SuccessfulOperation , SuccessfulOperation ,
@ -244,6 +249,9 @@ pub trait Api {
/// To test enum parameters /// To test enum parameters
fn test_enum_parameters(&self, enum_form_string_array: Option<&Vec<String>>, enum_form_string: Option<String>, enum_header_string_array: Option<&Vec<String>>, enum_header_string: Option<String>, enum_query_string_array: Option<&Vec<String>>, enum_query_string: Option<String>, enum_query_integer: Option<i32>, enum_query_double: Option<f64>, context: &Context) -> Box<Future<Item=TestEnumParametersResponse, Error=ApiError> + Send>; fn test_enum_parameters(&self, enum_form_string_array: Option<&Vec<String>>, enum_form_string: Option<String>, enum_header_string_array: Option<&Vec<String>>, enum_header_string: Option<String>, enum_query_string_array: Option<&Vec<String>>, enum_query_string: Option<String>, enum_query_integer: Option<i32>, enum_query_double: Option<f64>, context: &Context) -> Box<Future<Item=TestEnumParametersResponse, Error=ApiError> + Send>;
/// test inline additionalProperties
fn test_inline_additional_properties(&self, param: object, context: &Context) -> Box<Future<Item=TestInlineAdditionalPropertiesResponse, Error=ApiError> + Send>;
/// test json serialization of form data /// test json serialization of form data
fn test_json_form_data(&self, param: String, param2: String, context: &Context) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send>; fn test_json_form_data(&self, param: String, param2: String, context: &Context) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send>;
@ -345,6 +353,9 @@ pub trait ApiNoContext {
/// To test enum parameters /// To test enum parameters
fn test_enum_parameters(&self, enum_form_string_array: Option<&Vec<String>>, enum_form_string: Option<String>, enum_header_string_array: Option<&Vec<String>>, enum_header_string: Option<String>, enum_query_string_array: Option<&Vec<String>>, enum_query_string: Option<String>, enum_query_integer: Option<i32>, enum_query_double: Option<f64>) -> Box<Future<Item=TestEnumParametersResponse, Error=ApiError> + Send>; fn test_enum_parameters(&self, enum_form_string_array: Option<&Vec<String>>, enum_form_string: Option<String>, enum_header_string_array: Option<&Vec<String>>, enum_header_string: Option<String>, enum_query_string_array: Option<&Vec<String>>, enum_query_string: Option<String>, enum_query_integer: Option<i32>, enum_query_double: Option<f64>) -> Box<Future<Item=TestEnumParametersResponse, Error=ApiError> + Send>;
/// test inline additionalProperties
fn test_inline_additional_properties(&self, param: object) -> Box<Future<Item=TestInlineAdditionalPropertiesResponse, Error=ApiError> + Send>;
/// test json serialization of form data /// test json serialization of form data
fn test_json_form_data(&self, param: String, param2: String) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send>; fn test_json_form_data(&self, param: String, param2: String) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send>;
@ -477,6 +488,11 @@ impl<'a, T: Api> ApiNoContext for ContextWrapper<'a, T> {
self.api().test_enum_parameters(enum_form_string_array, enum_form_string, enum_header_string_array, enum_header_string, enum_query_string_array, enum_query_string, enum_query_integer, enum_query_double, &self.context()) self.api().test_enum_parameters(enum_form_string_array, enum_form_string, enum_header_string_array, enum_header_string, enum_query_string_array, enum_query_string, enum_query_integer, enum_query_double, &self.context())
} }
/// test inline additionalProperties
fn test_inline_additional_properties(&self, param: object) -> Box<Future<Item=TestInlineAdditionalPropertiesResponse, Error=ApiError> + Send> {
self.api().test_inline_additional_properties(param, &self.context())
}
/// test json serialization of form data /// test json serialization of form data
fn test_json_form_data(&self, param: String, param2: String) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send> { fn test_json_form_data(&self, param: String, param2: String) -> Box<Future<Item=TestJsonFormDataResponse, Error=ApiError> + Send> {
self.api().test_json_form_data(param, param2, &self.context()) self.api().test_json_form_data(param, param2, &self.context())

View File

@ -89,6 +89,10 @@ pub mod requests {
lazy_static! { lazy_static! {
pub static ref TEST_CLIENT_MODEL: Mime = mime!(Application/Json); pub static ref TEST_CLIENT_MODEL: Mime = mime!(Application/Json);
} }
/// Create Mime objects for the request content types for TestInlineAdditionalProperties
lazy_static! {
pub static ref TEST_INLINE_ADDITIONAL_PROPERTIES: Mime = mime!(Application/Json);
}
/// Create Mime objects for the request content types for TestClassname /// Create Mime objects for the request content types for TestClassname
lazy_static! { lazy_static! {
pub static ref TEST_CLASSNAME: Mime = mime!(Application/Json); pub static ref TEST_CLASSNAME: Mime = mime!(Application/Json);

View File

@ -481,76 +481,6 @@ impl HasOnlyReadOnly {
} }
} }
// Utility function for wrapping list elements when serializing xml
fn wrap_in_item<S>(item: &Vec<String>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serde_xml_rs::wrap_primitives(item, serializer, "item")
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ItemList(Vec<String>);
impl ::std::convert::From<Vec<String>> for ItemList {
fn from(x: Vec<String>) -> Self {
ItemList(x)
}
}
impl ::std::convert::From<ItemList> for Vec<String> {
fn from(x: ItemList) -> Self {
x.0
}
}
impl ::std::iter::FromIterator<String> for ItemList {
fn from_iter<U: IntoIterator<Item=String>>(u: U) -> Self {
ItemList(Vec::<String>::from_iter(u))
}
}
impl ::std::iter::IntoIterator for ItemList {
type Item = String;
type IntoIter = ::std::vec::IntoIter<String>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl<'a> ::std::iter::IntoIterator for &'a ItemList {
type Item = &'a String;
type IntoIter = ::std::slice::Iter<'a, String>;
fn into_iter(self) -> Self::IntoIter {
(&self.0).into_iter()
}
}
impl<'a> ::std::iter::IntoIterator for &'a mut ItemList {
type Item = &'a mut String;
type IntoIter = ::std::slice::IterMut<'a, String>;
fn into_iter(self) -> Self::IntoIter {
(&mut self.0).into_iter()
}
}
impl ::std::ops::Deref for ItemList {
type Target = Vec<String>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl ::std::ops::DerefMut for ItemList {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct List { pub struct List {
#[serde(rename = "123-list")] #[serde(rename = "123-list")]
@ -1056,27 +986,6 @@ impl User {
} }
} }
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "group")]
pub struct XmlObject {
#[serde(rename = "name")]
pub name: String,
#[serde(rename = "itemList")]
#[serde(serialize_with = "wrap_in_item")]
pub item_list: models::ItemList,
}
impl XmlObject {
pub fn new(name: String, item_list: models::ItemList, ) -> XmlObject {
XmlObject {
name: name,
item_list: item_list,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Cat { pub struct Cat {
#[serde(rename = "className")] #[serde(rename = "className")]
@ -1126,11 +1035,3 @@ impl Dog {
} }
} }
} }
//XML namespaces
pub mod namespaces {
lazy_static!{
pub static ref XMLOBJECT: String = "http://example.com/schema.xsd".to_string();
}
}

View File

@ -47,6 +47,7 @@ use {Api,
TestClientModelResponse, TestClientModelResponse,
TestEndpointParametersResponse, TestEndpointParametersResponse,
TestEnumParametersResponse, TestEnumParametersResponse,
TestInlineAdditionalPropertiesResponse,
TestJsonFormDataResponse, TestJsonFormDataResponse,
TestClassnameResponse, TestClassnameResponse,
AddPetResponse, AddPetResponse,
@ -200,11 +201,7 @@ fn add_routes<T>(router: &mut Router, api: T) where T: Api + Send + Sync + Clone
Ok(rsp) => match rsp { Ok(rsp) => match rsp {
GetXmlFeaturesResponse::Success(body) => { GetXmlFeaturesResponse::Success(body) => {
let body_string = serde_xml_rs::to_string(&body).expect("impossible to fail to serialize");
let mut namespaces = BTreeMap::new();
// An empty string is used to indicate a global namespace in xmltree.
namespaces.insert("".to_string(), models::namespaces::XMLOBJECT.clone());
let body_string = serde_xml_rs::to_string_with_namespaces(&body, namespaces).expect("impossible to fail to serialize");
let mut response = Response::with((status::Status::from_u16(200), body_string)); let mut response = Response::with((status::Status::from_u16(200), body_string));
response.headers.set(ContentType(mimetypes::responses::GET_XML_FEATURES_SUCCESS.clone())); response.headers.set(ContentType(mimetypes::responses::GET_XML_FEATURES_SUCCESS.clone()));
@ -781,6 +778,72 @@ fn add_routes<T>(router: &mut Router, api: T) where T: Api + Send + Sync + Clone
}, },
"TestEnumParameters"); "TestEnumParameters");
let api_clone = api.clone();
router.post(
"/v2/fake/inline-additionalProperties",
move |req: &mut Request| {
let mut context = Context::default();
// Helper function to provide a code block to use `?` in (to be replaced by the `catch` block when it exists).
fn handle_request<T>(req: &mut Request, api: &T, context: &mut Context) -> Result<Response, Response> where T: Api {
context.x_span_id = Some(req.headers.get::<XSpanId>().map(XSpanId::to_string).unwrap_or_else(|| self::uuid::Uuid::new_v4().to_string()));
context.auth_data = req.extensions.remove::<AuthData>();
context.authorization = req.extensions.remove::<Authorization>();
// Body parameters (note that non-required body parameters will ignore garbage
// values, rather than causing a 400 response). Produce warning header and logs for
// any unused fields.
let param_param_raw = req.get::<bodyparser::Raw>().map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse body parameter param - not valid UTF-8: {}", e))))?;
let mut unused_elements = Vec::new();
let param_param = if let Some(param_param_raw) = param_param_raw {
let deserializer = &mut serde_json::Deserializer::from_str(&param_param_raw);
let param_param: Option<object> = serde_ignored::deserialize(deserializer, |path| {
warn!("Ignoring unknown field in body: {}", path);
unused_elements.push(path.to_string());
}).map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse body parameter param - doesn't match schema: {}", e))))?;
param_param
} else {
None
};
let param_param = param_param.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter param".to_string())))?;
match api.test_inline_additional_properties(param_param, context).wait() {
Ok(rsp) => match rsp {
TestInlineAdditionalPropertiesResponse::SuccessfulOperation => {
let mut response = Response::with((status::Status::from_u16(200)));
context.x_span_id.as_ref().map(|header| response.headers.set(XSpanId(header.clone())));
if !unused_elements.is_empty() {
response.headers.set(Warning(format!("Ignoring unknown fields in body: {:?}", unused_elements)));
}
Ok(response)
},
},
Err(_) => {
// Application code returned an error. This should not happen, as the implementation should
// return a valid response.
Err(Response::with((status::InternalServerError, "An internal error occurred".to_string())))
}
}
}
handle_request(req, &api_clone, &mut context).or_else(|mut response| {
context.x_span_id.as_ref().map(|header| response.headers.set(XSpanId(header.clone())));
Ok(response)
})
},
"TestInlineAdditionalProperties");
let api_clone = api.clone(); let api_clone = api.clone();
router.get( router.get(
"/v2/fake/jsonFormData", "/v2/fake/jsonFormData",