diff --git a/modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache b/modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache index 15df4868d15b..4c6da0da8d10 100644 --- a/modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache +++ b/modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache @@ -1,11 +1,12 @@ {{>partial_header}} #[allow(unused_imports)] use std::rc::Rc; -use std::borrow::Borrow; +{{^supportAsync}}use std::borrow::Borrow;{{/supportAsync}} use std::option::Option; use reqwest; +use crate::apis::ResponseContent; use super::{Error, configuration}; {{^supportAsync}} @@ -44,15 +45,59 @@ pub struct {{{operationIdCamelCase}}}Params { {{/operation}} {{/operations}} +{{#operations}} +{{#operation}} +/// struct for typed successes of method `{{operationId}}` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum {{{operationIdCamelCase}}}Success { + {{#responses}} + {{#is2xx}} + Status{{code}}({{#isEnum}}{{{enumName}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}), + {{/is2xx}} + {{#is3xx}} + Status{{code}}({{#isEnum}}{{{enumName}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}), + {{/is3xx}} + {{/responses}} + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +{{/operation}} +{{/operations}} +{{#operations}} +{{#operation}} +/// struct for typed errors of method `{{operationId}}` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum {{{operationIdCamelCase}}}Error { + {{#responses}} + {{#is4xx}} + Status{{code}}({{#isEnum}}{{{enumName}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}), + {{/is4xx}} + {{#is5xx}} + Status{{code}}({{#isEnum}}{{{enumName}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}), + {{/is5xx}} + {{#isDefault}} + DefaultResponse({{#isEnum}}{{{enumName}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}), + {{/isDefault}} + {{/responses}} + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +{{/operation}} +{{/operations}} + {{^supportAsync}} pub trait {{{classname}}} { {{#operations}} {{#operation}} {{#vendorExtensions.x-group-parameters}} - fn {{{operationId}}}(&self{{#allParams}}{{#-first}}, params: {{{operationIdCamelCase}}}Params{{/-first}}{{/allParams}}) -> Result<{{^returnType}}(){{/returnType}}{{#returnType}}{{{returnType}}}{{/returnType}}, Error>; + fn {{{operationId}}}(&self{{#allParams}}{{#-first}}, params: {{{operationIdCamelCase}}}Params{{/-first}}{{/allParams}}) -> Result, Error<{{{operationIdCamelCase}}}Error>>; {{/vendorExtensions.x-group-parameters}} {{^vendorExtensions.x-group-parameters}} - fn {{{operationId}}}(&self, {{#allParams}}{{{paramName}}}: {{^required}}Option<{{/required}}{{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{#isString}}&str{{/isString}}{{#isUuid}}&str{{/isUuid}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}crate::models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{^required}}>{{/required}}{{#required}}{{#isNullable}}>{{/isNullable}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) -> Result<{{^returnType}}(){{/returnType}}{{#returnType}}{{{returnType}}}{{/returnType}}, Error>; + fn {{{operationId}}}(&self, {{#allParams}}{{{paramName}}}: {{^required}}Option<{{/required}}{{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{#isString}}&str{{/isString}}{{#isUuid}}&str{{/isUuid}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}crate::models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{^required}}>{{/required}}{{#required}}{{#isNullable}}>{{/isNullable}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) -> Result, Error<{{{operationIdCamelCase}}}Error>>; {{/vendorExtensions.x-group-parameters}} {{/operation}} {{/operations}} @@ -63,7 +108,7 @@ impl {{{classname}}} for {{{classname}}}Client { {{#operations}} {{#operation}} {{#vendorExtensions.x-group-parameters}} - {{#supportAsync}}pub async {{/supportAsync}}fn {{{operationId}}}({{^supportAsync}}&self{{/supportAsync}}{{#supportAsync}}configuration: &configuration::Configuration{{/supportAsync}}{{#allParams}}{{#-first}}, params: {{{operationIdCamelCase}}}Params{{/-first}}{{/allParams}}) -> Result<{{^returnType}}(){{/returnType}}{{#returnType}}{{{returnType}}}{{/returnType}}, Error> { + {{#supportAsync}}pub async {{/supportAsync}}fn {{{operationId}}}({{^supportAsync}}&self{{/supportAsync}}{{#supportAsync}}configuration: &configuration::Configuration{{/supportAsync}}{{#allParams}}{{#-first}}, params: {{{operationIdCamelCase}}}Params{{/-first}}{{/allParams}}) -> Result, Error<{{{operationIdCamelCase}}}Error>> { // unbox the parameters {{#allParams}} let {{paramName}} = params.{{paramName}}; @@ -71,7 +116,7 @@ impl {{{classname}}} for {{{classname}}}Client { {{/vendorExtensions.x-group-parameters}} {{^vendorExtensions.x-group-parameters}} - {{#supportAsync}}pub async {{/supportAsync}}fn {{{operationId}}}({{^supportAsync}}&self{{/supportAsync}}{{#supportAsync}}configuration: &configuration::Configuration{{/supportAsync}}, {{#allParams}}{{{paramName}}}: {{^required}}Option<{{/required}}{{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{#isString}}&str{{/isString}}{{#isUuid}}&str{{/isUuid}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}crate::models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{^required}}>{{/required}}{{#required}}{{#isNullable}}>{{/isNullable}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) -> Result<{{^returnType}}(){{/returnType}}{{#returnType}}{{{returnType}}}{{/returnType}}, Error> { + {{#supportAsync}}pub async {{/supportAsync}}fn {{{operationId}}}({{^supportAsync}}&self{{/supportAsync}}{{#supportAsync}}configuration: &configuration::Configuration{{/supportAsync}}, {{#allParams}}{{{paramName}}}: {{^required}}Option<{{/required}}{{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{#isString}}&str{{/isString}}{{#isUuid}}&str{{/isUuid}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}crate::models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{^required}}>{{/required}}{{#required}}{{#isNullable}}>{{/isNullable}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) -> Result, Error<{{{operationIdCamelCase}}}Error>> { {{/vendorExtensions.x-group-parameters}} {{^supportAsync}} let configuration: &configuration::Configuration = self.configuration.borrow(); @@ -263,18 +308,20 @@ impl {{{classname}}} for {{{classname}}}Client { {{/hasBodyParam}} let req = req_builder.build()?; - {{^returnType}} - client.execute(req){{#supportAsync}}.await{{/supportAsync}}?.error_for_status()?; - Ok(()) - {{/returnType}} - {{#returnType}} - {{#supportAsync}} - Ok(client.execute(req).await?.error_for_status()?.json::<{{{.}}}>().await?) - {{/supportAsync}} - {{^supportAsync}} - Ok(client.execute(req)?.error_for_status()?.json()?) - {{/supportAsync}} - {{/returnType}} + let {{^supportAsync}}mut {{/supportAsync}}resp = client.execute(req){{#supportAsync}}.await{{/supportAsync}}?; + + let status = resp.status(); + let content = resp.text(){{#supportAsync}}.await{{/supportAsync}}?; + + if status.is_success() { + let entity: Option<{{{operationIdCamelCase}}}Success> = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option<{{{operationIdCamelCase}}}Error> = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } {{/operation}} diff --git a/modules/openapi-generator/src/main/resources/rust/reqwest/api_mod.mustache b/modules/openapi-generator/src/main/resources/rust/reqwest/api_mod.mustache index 28ac207d4823..65d2e2bc9a43 100644 --- a/modules/openapi-generator/src/main/resources/rust/reqwest/api_mod.mustache +++ b/modules/openapi-generator/src/main/resources/rust/reqwest/api_mod.mustache @@ -1,26 +1,34 @@ use reqwest; use serde_json; +#[derive(Debug, Clone)] +pub struct ResponseContent { + pub status: reqwest::StatusCode, + pub content: String, + pub entity: Option, +} + #[derive(Debug)] -pub enum Error { +pub enum Error { Reqwest(reqwest::Error), Serde(serde_json::Error), Io(std::io::Error), + ResponseError(ResponseContent), } -impl From for Error { +impl From for Error { fn from(e: reqwest::Error) -> Self { Error::Reqwest(e) } } -impl From for Error { +impl From for Error { fn from(e: serde_json::Error) -> Self { Error::Serde(e) } } -impl From for Error { +impl From for Error { fn from(e: std::io::Error) -> Self { Error::Io(e) } @@ -32,26 +40,7 @@ pub fn urlencode>(s: T) -> String { {{#apiInfo}} {{#apis}} -mod {{{classFilename}}}; -{{#operations}} -{{#operation}} -{{^supportAsync}} -{{#-first}} -pub use self::{{{classFilename}}}::{ {{{classname}}}, {{{classname}}}Client }; -{{/-first}} -{{/supportAsync}} -{{#supportAsync}} -pub use self::{{{classFilename}}}::{ {{{operationId}}} }; -{{/supportAsync}} -{{#vendorExtensions.x-group-parameters}} -{{#allParams}} -{{#-first}} -pub use self::{{{classFilename}}}::{{{operationIdCamelCase}}}Params as {{{classname}}}{{{operationIdCamelCase}}}Params; -{{/-first}} -{{/allParams}} -{{/vendorExtensions.x-group-parameters}} -{{/operation}} -{{/operations}} +pub mod {{{classFilename}}}; {{/apis}} {{/apiInfo}} diff --git a/modules/openapi-generator/src/main/resources/rust/reqwest/client.mustache b/modules/openapi-generator/src/main/resources/rust/reqwest/client.mustache index 60be0f295fba..03625839d8e2 100644 --- a/modules/openapi-generator/src/main/resources/rust/reqwest/client.mustache +++ b/modules/openapi-generator/src/main/resources/rust/reqwest/client.mustache @@ -8,7 +8,7 @@ pub struct APIClient { {{#operations}} {{#operation}} {{#-last}} - {{{classFilename}}}: Box, + {{{classFilename}}}: Box, {{/-last}} {{/operation}} {{/operations}} @@ -26,7 +26,7 @@ impl APIClient { {{#operations}} {{#operation}} {{#-last}} - {{{classFilename}}}: Box::new(crate::apis::{{{classname}}}Client::new(rc.clone())), + {{{classFilename}}}: Box::new(crate::apis::{{{classFilename}}}::{{{classname}}}Client::new(rc.clone())), {{/-last}} {{/operation}} {{/operations}} @@ -40,7 +40,7 @@ impl APIClient { {{#operations}} {{#operation}} {{#-last}} - pub fn {{{classFilename}}}(&self) -> &dyn crate::apis::{{{classname}}}{ + pub fn {{{classFilename}}}(&self) -> &dyn crate::apis::{{{classFilename}}}::{{{classname}}}{ self.{{{classFilename}}}.as_ref() } diff --git a/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/client.rs b/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/client.rs index 7566e9e84799..b10fef0b5548 100644 --- a/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/client.rs +++ b/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/client.rs @@ -3,7 +3,7 @@ use std::rc::Rc; use super::configuration::Configuration; pub struct APIClient { - default_api: Box, + default_api: Box, } impl APIClient { @@ -11,11 +11,11 @@ impl APIClient { let rc = Rc::new(configuration); APIClient { - default_api: Box::new(crate::apis::DefaultApiClient::new(rc.clone())), + default_api: Box::new(crate::apis::default_api::DefaultApiClient::new(rc.clone())), } } - pub fn default_api(&self) -> &dyn crate::apis::DefaultApi{ + pub fn default_api(&self) -> &dyn crate::apis::default_api::DefaultApi{ self.default_api.as_ref() } diff --git a/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/default_api.rs b/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/default_api.rs index 8c907ea7923f..e879279c4ac0 100644 --- a/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/default_api.rs +++ b/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/default_api.rs @@ -15,6 +15,7 @@ use std::option::Option; use reqwest; +use crate::apis::ResponseContent; use super::{Error, configuration}; pub struct DefaultApiClient { @@ -30,12 +31,31 @@ impl DefaultApiClient { } +/// struct for typed successes of method `fileresponsetest` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FileresponsetestSuccess { + Status200(std::path::PathBuf), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `fileresponsetest` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FileresponsetestError { + DefaultResponse(std::path::PathBuf), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + + pub trait DefaultApi { - fn fileresponsetest(&self, ) -> Result; + fn fileresponsetest(&self, ) -> Result, Error>; } impl DefaultApi for DefaultApiClient { - fn fileresponsetest(&self, ) -> Result { + fn fileresponsetest(&self, ) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -47,7 +67,20 @@ impl DefaultApi for DefaultApiClient { } let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } } diff --git a/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/mod.rs b/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/mod.rs index 77bd60c058a5..0ca4089f9d29 100644 --- a/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/mod.rs +++ b/samples/client/petstore/rust/reqwest/fileResponseTest/src/apis/mod.rs @@ -1,26 +1,34 @@ use reqwest; use serde_json; +#[derive(Debug, Clone)] +pub struct ResponseContent { + pub status: reqwest::StatusCode, + pub content: String, + pub entity: Option, +} + #[derive(Debug)] -pub enum Error { +pub enum Error { Reqwest(reqwest::Error), Serde(serde_json::Error), Io(std::io::Error), + ResponseError(ResponseContent), } -impl From for Error { +impl From for Error { fn from(e: reqwest::Error) -> Self { Error::Reqwest(e) } } -impl From for Error { +impl From for Error { fn from(e: serde_json::Error) -> Self { Error::Serde(e) } } -impl From for Error { +impl From for Error { fn from(e: std::io::Error) -> Self { Error::Io(e) } @@ -30,8 +38,7 @@ pub fn urlencode>(s: T) -> String { ::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect() } -mod default_api; -pub use self::default_api::{ DefaultApi, DefaultApiClient }; +pub mod default_api; pub mod client; pub mod configuration; diff --git a/samples/client/petstore/rust/reqwest/petstore-async/src/apis/mod.rs b/samples/client/petstore/rust/reqwest/petstore-async/src/apis/mod.rs index 898d84e1e89c..087b76befa4e 100644 --- a/samples/client/petstore/rust/reqwest/petstore-async/src/apis/mod.rs +++ b/samples/client/petstore/rust/reqwest/petstore-async/src/apis/mod.rs @@ -1,26 +1,34 @@ use reqwest; use serde_json; +#[derive(Debug, Clone)] +pub struct ResponseContent { + pub status: reqwest::StatusCode, + pub content: String, + pub entity: Option, +} + #[derive(Debug)] -pub enum Error { +pub enum Error { Reqwest(reqwest::Error), Serde(serde_json::Error), Io(std::io::Error), + ResponseError(ResponseContent), } -impl From for Error { +impl From for Error { fn from(e: reqwest::Error) -> Self { Error::Reqwest(e) } } -impl From for Error { +impl From for Error { fn from(e: serde_json::Error) -> Self { Error::Serde(e) } } -impl From for Error { +impl From for Error { fn from(e: std::io::Error) -> Self { Error::Io(e) } @@ -30,46 +38,8 @@ pub fn urlencode>(s: T) -> String { ::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect() } -mod pet_api; -pub use self::pet_api::{ add_pet }; -pub use self::pet_api::AddPetParams as PetApiAddPetParams; -pub use self::pet_api::{ delete_pet }; -pub use self::pet_api::DeletePetParams as PetApiDeletePetParams; -pub use self::pet_api::{ find_pets_by_status }; -pub use self::pet_api::FindPetsByStatusParams as PetApiFindPetsByStatusParams; -pub use self::pet_api::{ find_pets_by_tags }; -pub use self::pet_api::FindPetsByTagsParams as PetApiFindPetsByTagsParams; -pub use self::pet_api::{ get_pet_by_id }; -pub use self::pet_api::GetPetByIdParams as PetApiGetPetByIdParams; -pub use self::pet_api::{ update_pet }; -pub use self::pet_api::UpdatePetParams as PetApiUpdatePetParams; -pub use self::pet_api::{ update_pet_with_form }; -pub use self::pet_api::UpdatePetWithFormParams as PetApiUpdatePetWithFormParams; -pub use self::pet_api::{ upload_file }; -pub use self::pet_api::UploadFileParams as PetApiUploadFileParams; -mod store_api; -pub use self::store_api::{ delete_order }; -pub use self::store_api::DeleteOrderParams as StoreApiDeleteOrderParams; -pub use self::store_api::{ get_inventory }; -pub use self::store_api::{ get_order_by_id }; -pub use self::store_api::GetOrderByIdParams as StoreApiGetOrderByIdParams; -pub use self::store_api::{ place_order }; -pub use self::store_api::PlaceOrderParams as StoreApiPlaceOrderParams; -mod user_api; -pub use self::user_api::{ create_user }; -pub use self::user_api::CreateUserParams as UserApiCreateUserParams; -pub use self::user_api::{ create_users_with_array_input }; -pub use self::user_api::CreateUsersWithArrayInputParams as UserApiCreateUsersWithArrayInputParams; -pub use self::user_api::{ create_users_with_list_input }; -pub use self::user_api::CreateUsersWithListInputParams as UserApiCreateUsersWithListInputParams; -pub use self::user_api::{ delete_user }; -pub use self::user_api::DeleteUserParams as UserApiDeleteUserParams; -pub use self::user_api::{ get_user_by_name }; -pub use self::user_api::GetUserByNameParams as UserApiGetUserByNameParams; -pub use self::user_api::{ login_user }; -pub use self::user_api::LoginUserParams as UserApiLoginUserParams; -pub use self::user_api::{ logout_user }; -pub use self::user_api::{ update_user }; -pub use self::user_api::UpdateUserParams as UserApiUpdateUserParams; +pub mod pet_api; +pub mod store_api; +pub mod user_api; pub mod configuration; diff --git a/samples/client/petstore/rust/reqwest/petstore-async/src/apis/pet_api.rs b/samples/client/petstore/rust/reqwest/petstore-async/src/apis/pet_api.rs index f43db5ae5806..65b2ebe78671 100644 --- a/samples/client/petstore/rust/reqwest/petstore-async/src/apis/pet_api.rs +++ b/samples/client/petstore/rust/reqwest/petstore-async/src/apis/pet_api.rs @@ -10,11 +10,12 @@ #[allow(unused_imports)] use std::rc::Rc; -use std::borrow::Borrow; + use std::option::Option; use reqwest; +use crate::apis::ResponseContent; use super::{Error, configuration}; /// struct for passing parameters to the method `add_pet` @@ -83,7 +84,150 @@ pub struct UploadFileParams { } - pub async fn add_pet(configuration: &configuration::Configuration, params: AddPetParams) -> Result<(), Error> { +/// struct for typed successes of method `add_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddPetSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `delete_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeletePetSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `find_pets_by_status` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FindPetsByStatusSuccess { + Status200(Vec), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `find_pets_by_tags` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FindPetsByTagsSuccess { + Status200(Vec), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `get_pet_by_id` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetPetByIdSuccess { + Status200(crate::models::Pet), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `update_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePetSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `update_pet_with_form` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePetWithFormSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `upload_file` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UploadFileSuccess { + Status200(crate::models::ApiResponse), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `add_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddPetError { + Status405(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `delete_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeletePetError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `find_pets_by_status` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FindPetsByStatusError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `find_pets_by_tags` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FindPetsByTagsError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `get_pet_by_id` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetPetByIdError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `update_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePetError { + Status400(), + Status404(), + Status405(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `update_pet_with_form` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePetWithFormError { + Status405(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `upload_file` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UploadFileError { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + + + pub async fn add_pet(configuration: &configuration::Configuration, params: AddPetParams) -> Result, Error> { // unbox the parameters let body = params.body; @@ -101,11 +245,23 @@ pub struct UploadFileParams { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn delete_pet(configuration: &configuration::Configuration, params: DeletePetParams) -> Result<(), Error> { + pub async fn delete_pet(configuration: &configuration::Configuration, params: DeletePetParams) -> Result, Error> { // unbox the parameters let pet_id = params.pet_id; let api_key = params.api_key; @@ -126,11 +282,23 @@ pub struct UploadFileParams { }; let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn find_pets_by_status(configuration: &configuration::Configuration, params: FindPetsByStatusParams) -> Result, Error> { + pub async fn find_pets_by_status(configuration: &configuration::Configuration, params: FindPetsByStatusParams) -> Result, Error> { // unbox the parameters let status = params.status; @@ -148,10 +316,23 @@ pub struct UploadFileParams { }; let req = req_builder.build()?; - Ok(client.execute(req).await?.error_for_status()?.json::>().await?) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn find_pets_by_tags(configuration: &configuration::Configuration, params: FindPetsByTagsParams) -> Result, Error> { + pub async fn find_pets_by_tags(configuration: &configuration::Configuration, params: FindPetsByTagsParams) -> Result, Error> { // unbox the parameters let tags = params.tags; @@ -169,10 +350,23 @@ pub struct UploadFileParams { }; let req = req_builder.build()?; - Ok(client.execute(req).await?.error_for_status()?.json::>().await?) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn get_pet_by_id(configuration: &configuration::Configuration, params: GetPetByIdParams) -> Result { + pub async fn get_pet_by_id(configuration: &configuration::Configuration, params: GetPetByIdParams) -> Result, Error> { // unbox the parameters let pet_id = params.pet_id; @@ -194,10 +388,23 @@ pub struct UploadFileParams { }; let req = req_builder.build()?; - Ok(client.execute(req).await?.error_for_status()?.json::().await?) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn update_pet(configuration: &configuration::Configuration, params: UpdatePetParams) -> Result<(), Error> { + pub async fn update_pet(configuration: &configuration::Configuration, params: UpdatePetParams) -> Result, Error> { // unbox the parameters let body = params.body; @@ -215,11 +422,23 @@ pub struct UploadFileParams { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn update_pet_with_form(configuration: &configuration::Configuration, params: UpdatePetWithFormParams) -> Result<(), Error> { + pub async fn update_pet_with_form(configuration: &configuration::Configuration, params: UpdatePetWithFormParams) -> Result, Error> { // unbox the parameters let pet_id = params.pet_id; let name = params.name; @@ -246,11 +465,23 @@ pub struct UploadFileParams { req_builder = req_builder.form(&form_params); let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn upload_file(configuration: &configuration::Configuration, params: UploadFileParams) -> Result { + pub async fn upload_file(configuration: &configuration::Configuration, params: UploadFileParams) -> Result, Error> { // unbox the parameters let pet_id = params.pet_id; let additional_metadata = params.additional_metadata; @@ -275,6 +506,19 @@ pub struct UploadFileParams { req_builder = req_builder.multipart(form); let req = req_builder.build()?; - Ok(client.execute(req).await?.error_for_status()?.json::().await?) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } diff --git a/samples/client/petstore/rust/reqwest/petstore-async/src/apis/store_api.rs b/samples/client/petstore/rust/reqwest/petstore-async/src/apis/store_api.rs index 2ccebe8022f6..821f0620146a 100644 --- a/samples/client/petstore/rust/reqwest/petstore-async/src/apis/store_api.rs +++ b/samples/client/petstore/rust/reqwest/petstore-async/src/apis/store_api.rs @@ -10,11 +10,12 @@ #[allow(unused_imports)] use std::rc::Rc; -use std::borrow::Borrow; + use std::option::Option; use reqwest; +use crate::apis::ResponseContent; use super::{Error, configuration}; /// struct for passing parameters to the method `delete_order` @@ -39,7 +40,80 @@ pub struct PlaceOrderParams { } - pub async fn delete_order(configuration: &configuration::Configuration, params: DeleteOrderParams) -> Result<(), Error> { +/// struct for typed successes of method `delete_order` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteOrderSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `get_inventory` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetInventorySuccess { + Status200(::std::collections::HashMap), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `get_order_by_id` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrderByIdSuccess { + Status200(crate::models::Order), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `place_order` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PlaceOrderSuccess { + Status200(crate::models::Order), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `delete_order` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteOrderError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `get_inventory` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetInventoryError { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `get_order_by_id` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrderByIdError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `place_order` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PlaceOrderError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + + + pub async fn delete_order(configuration: &configuration::Configuration, params: DeleteOrderParams) -> Result, Error> { // unbox the parameters let order_id = params.order_id; @@ -53,11 +127,23 @@ pub struct PlaceOrderParams { } let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn get_inventory(configuration: &configuration::Configuration) -> Result<::std::collections::HashMap, Error> { + pub async fn get_inventory(configuration: &configuration::Configuration) -> Result, Error> { // unbox the parameters let client = &configuration.client; @@ -78,10 +164,23 @@ pub struct PlaceOrderParams { }; let req = req_builder.build()?; - Ok(client.execute(req).await?.error_for_status()?.json::<::std::collections::HashMap>().await?) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn get_order_by_id(configuration: &configuration::Configuration, params: GetOrderByIdParams) -> Result { + pub async fn get_order_by_id(configuration: &configuration::Configuration, params: GetOrderByIdParams) -> Result, Error> { // unbox the parameters let order_id = params.order_id; @@ -95,10 +194,23 @@ pub struct PlaceOrderParams { } let req = req_builder.build()?; - Ok(client.execute(req).await?.error_for_status()?.json::().await?) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn place_order(configuration: &configuration::Configuration, params: PlaceOrderParams) -> Result { + pub async fn place_order(configuration: &configuration::Configuration, params: PlaceOrderParams) -> Result, Error> { // unbox the parameters let body = params.body; @@ -113,6 +225,19 @@ pub struct PlaceOrderParams { req_builder = req_builder.json(&body); let req = req_builder.build()?; - Ok(client.execute(req).await?.error_for_status()?.json::().await?) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } diff --git a/samples/client/petstore/rust/reqwest/petstore-async/src/apis/user_api.rs b/samples/client/petstore/rust/reqwest/petstore-async/src/apis/user_api.rs index ac3ec992d880..386dc9220c6e 100644 --- a/samples/client/petstore/rust/reqwest/petstore-async/src/apis/user_api.rs +++ b/samples/client/petstore/rust/reqwest/petstore-async/src/apis/user_api.rs @@ -10,11 +10,12 @@ #[allow(unused_imports)] use std::rc::Rc; -use std::borrow::Borrow; + use std::option::Option; use reqwest; +use crate::apis::ResponseContent; use super::{Error, configuration}; /// struct for passing parameters to the method `create_user` @@ -71,7 +72,149 @@ pub struct UpdateUserParams { } - pub async fn create_user(configuration: &configuration::Configuration, params: CreateUserParams) -> Result<(), Error> { +/// struct for typed successes of method `create_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUserSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `create_users_with_array_input` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUsersWithArrayInputSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `create_users_with_list_input` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUsersWithListInputSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `delete_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteUserSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `get_user_by_name` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserByNameSuccess { + Status200(crate::models::User), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `login_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum LoginUserSuccess { + Status200(String), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `logout_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum LogoutUserSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `update_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateUserSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `create_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUserError { + DefaultResponse(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `create_users_with_array_input` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUsersWithArrayInputError { + DefaultResponse(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `create_users_with_list_input` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUsersWithListInputError { + DefaultResponse(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `delete_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteUserError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `get_user_by_name` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserByNameError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `login_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum LoginUserError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `logout_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum LogoutUserError { + DefaultResponse(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `update_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateUserError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + + + pub async fn create_user(configuration: &configuration::Configuration, params: CreateUserParams) -> Result, Error> { // unbox the parameters let body = params.body; @@ -86,11 +229,23 @@ pub struct UpdateUserParams { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn create_users_with_array_input(configuration: &configuration::Configuration, params: CreateUsersWithArrayInputParams) -> Result<(), Error> { + pub async fn create_users_with_array_input(configuration: &configuration::Configuration, params: CreateUsersWithArrayInputParams) -> Result, Error> { // unbox the parameters let body = params.body; @@ -105,11 +260,23 @@ pub struct UpdateUserParams { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn create_users_with_list_input(configuration: &configuration::Configuration, params: CreateUsersWithListInputParams) -> Result<(), Error> { + pub async fn create_users_with_list_input(configuration: &configuration::Configuration, params: CreateUsersWithListInputParams) -> Result, Error> { // unbox the parameters let body = params.body; @@ -124,11 +291,23 @@ pub struct UpdateUserParams { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn delete_user(configuration: &configuration::Configuration, params: DeleteUserParams) -> Result<(), Error> { + pub async fn delete_user(configuration: &configuration::Configuration, params: DeleteUserParams) -> Result, Error> { // unbox the parameters let username = params.username; @@ -142,11 +321,23 @@ pub struct UpdateUserParams { } let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn get_user_by_name(configuration: &configuration::Configuration, params: GetUserByNameParams) -> Result { + pub async fn get_user_by_name(configuration: &configuration::Configuration, params: GetUserByNameParams) -> Result, Error> { // unbox the parameters let username = params.username; @@ -160,10 +351,23 @@ pub struct UpdateUserParams { } let req = req_builder.build()?; - Ok(client.execute(req).await?.error_for_status()?.json::().await?) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn login_user(configuration: &configuration::Configuration, params: LoginUserParams) -> Result { + pub async fn login_user(configuration: &configuration::Configuration, params: LoginUserParams) -> Result, Error> { // unbox the parameters let username = params.username; let password = params.password; @@ -180,10 +384,23 @@ pub struct UpdateUserParams { } let req = req_builder.build()?; - Ok(client.execute(req).await?.error_for_status()?.json::().await?) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn logout_user(configuration: &configuration::Configuration) -> Result<(), Error> { + pub async fn logout_user(configuration: &configuration::Configuration) -> Result, Error> { // unbox the parameters let client = &configuration.client; @@ -196,11 +413,23 @@ pub struct UpdateUserParams { } let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - pub async fn update_user(configuration: &configuration::Configuration, params: UpdateUserParams) -> Result<(), Error> { + pub async fn update_user(configuration: &configuration::Configuration, params: UpdateUserParams) -> Result, Error> { // unbox the parameters let username = params.username; let body = params.body; @@ -216,7 +445,19 @@ pub struct UpdateUserParams { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req).await?.error_for_status()?; - Ok(()) + let resp = client.execute(req).await?; + + let status = resp.status(); + let content = resp.text().await?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } diff --git a/samples/client/petstore/rust/reqwest/petstore-async/tests/pet_tests.rs b/samples/client/petstore/rust/reqwest/petstore-async/tests/pet_tests.rs index 50829ebaa3e8..eff0553edf70 100644 --- a/samples/client/petstore/rust/reqwest/petstore-async/tests/pet_tests.rs +++ b/samples/client/petstore/rust/reqwest/petstore-async/tests/pet_tests.rs @@ -5,7 +5,6 @@ use petstore_reqwest_async::apis::configuration; //use petstore_reqwest::apis::PetApiUpdatePetWithFormParams; use petstore_reqwest_async::models::{Pet}; use std::option::Option; -use std::rc::Rc; #[test] fn test_pet() { @@ -18,17 +17,10 @@ fn test_pet() { new_pet.id = Option::Some(8787); // add pet - let _add_result = petstore_reqwest_async::apis::add_pet(&config, new_pet); + let _add_result = petstore_reqwest_async::apis::pet_api::add_pet(&config, new_pet); // get pet - let pet_result = petstore_reqwest_async::apis::get_pet_by_id(&config, 8787); + let pet_result = petstore_reqwest_async::apis::pet_api::get_pet_by_id(&config, 8787); - let _pet_result = match pet_result { - Ok(pet) => { - assert_eq!(pet.id, Option::Some(8787)); - assert_eq!(pet.name, "Rust Pet"); - assert_eq!(pet.photo_urls, vec!["https://11".to_string(), "https://22".to_string()]); - }, - Err(error) => println!("error: {:?}", error), - }; + // TODO Testing async functions requires some additionnal testing crates. } diff --git a/samples/client/petstore/rust/reqwest/petstore/src/apis/client.rs b/samples/client/petstore/rust/reqwest/petstore/src/apis/client.rs index 8a3963dcc539..1d3d1389dd9b 100644 --- a/samples/client/petstore/rust/reqwest/petstore/src/apis/client.rs +++ b/samples/client/petstore/rust/reqwest/petstore/src/apis/client.rs @@ -3,9 +3,9 @@ use std::rc::Rc; use super::configuration::Configuration; pub struct APIClient { - pet_api: Box, - store_api: Box, - user_api: Box, + pet_api: Box, + store_api: Box, + user_api: Box, } impl APIClient { @@ -13,21 +13,21 @@ impl APIClient { let rc = Rc::new(configuration); APIClient { - pet_api: Box::new(crate::apis::PetApiClient::new(rc.clone())), - store_api: Box::new(crate::apis::StoreApiClient::new(rc.clone())), - user_api: Box::new(crate::apis::UserApiClient::new(rc.clone())), + pet_api: Box::new(crate::apis::pet_api::PetApiClient::new(rc.clone())), + store_api: Box::new(crate::apis::store_api::StoreApiClient::new(rc.clone())), + user_api: Box::new(crate::apis::user_api::UserApiClient::new(rc.clone())), } } - pub fn pet_api(&self) -> &dyn crate::apis::PetApi{ + pub fn pet_api(&self) -> &dyn crate::apis::pet_api::PetApi{ self.pet_api.as_ref() } - pub fn store_api(&self) -> &dyn crate::apis::StoreApi{ + pub fn store_api(&self) -> &dyn crate::apis::store_api::StoreApi{ self.store_api.as_ref() } - pub fn user_api(&self) -> &dyn crate::apis::UserApi{ + pub fn user_api(&self) -> &dyn crate::apis::user_api::UserApi{ self.user_api.as_ref() } diff --git a/samples/client/petstore/rust/reqwest/petstore/src/apis/mod.rs b/samples/client/petstore/rust/reqwest/petstore/src/apis/mod.rs index 2ce86d2804a5..fb9152c3a829 100644 --- a/samples/client/petstore/rust/reqwest/petstore/src/apis/mod.rs +++ b/samples/client/petstore/rust/reqwest/petstore/src/apis/mod.rs @@ -1,26 +1,34 @@ use reqwest; use serde_json; +#[derive(Debug, Clone)] +pub struct ResponseContent { + pub status: reqwest::StatusCode, + pub content: String, + pub entity: Option, +} + #[derive(Debug)] -pub enum Error { +pub enum Error { Reqwest(reqwest::Error), Serde(serde_json::Error), Io(std::io::Error), + ResponseError(ResponseContent), } -impl From for Error { +impl From for Error { fn from(e: reqwest::Error) -> Self { Error::Reqwest(e) } } -impl From for Error { +impl From for Error { fn from(e: serde_json::Error) -> Self { Error::Serde(e) } } -impl From for Error { +impl From for Error { fn from(e: std::io::Error) -> Self { Error::Io(e) } @@ -30,12 +38,9 @@ pub fn urlencode>(s: T) -> String { ::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect() } -mod pet_api; -pub use self::pet_api::{ PetApi, PetApiClient }; -mod store_api; -pub use self::store_api::{ StoreApi, StoreApiClient }; -mod user_api; -pub use self::user_api::{ UserApi, UserApiClient }; +pub mod pet_api; +pub mod store_api; +pub mod user_api; pub mod client; pub mod configuration; diff --git a/samples/client/petstore/rust/reqwest/petstore/src/apis/pet_api.rs b/samples/client/petstore/rust/reqwest/petstore/src/apis/pet_api.rs index 1d90f2f1219b..064875108f3c 100644 --- a/samples/client/petstore/rust/reqwest/petstore/src/apis/pet_api.rs +++ b/samples/client/petstore/rust/reqwest/petstore/src/apis/pet_api.rs @@ -15,6 +15,7 @@ use std::option::Option; use reqwest; +use crate::apis::ResponseContent; use super::{Error, configuration}; pub struct PetApiClient { @@ -30,19 +31,162 @@ impl PetApiClient { } +/// struct for typed successes of method `add_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddPetSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `delete_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeletePetSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `find_pets_by_status` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FindPetsByStatusSuccess { + Status200(Vec), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `find_pets_by_tags` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FindPetsByTagsSuccess { + Status200(Vec), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `get_pet_by_id` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetPetByIdSuccess { + Status200(crate::models::Pet), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `update_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePetSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `update_pet_with_form` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePetWithFormSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `upload_file` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UploadFileSuccess { + Status200(crate::models::ApiResponse), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `add_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddPetError { + Status405(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `delete_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeletePetError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `find_pets_by_status` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FindPetsByStatusError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `find_pets_by_tags` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum FindPetsByTagsError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `get_pet_by_id` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetPetByIdError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `update_pet` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePetError { + Status400(), + Status404(), + Status405(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `update_pet_with_form` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePetWithFormError { + Status405(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `upload_file` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UploadFileError { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + + pub trait PetApi { - fn add_pet(&self, body: crate::models::Pet) -> Result<(), Error>; - fn delete_pet(&self, pet_id: i64, api_key: Option<&str>) -> Result<(), Error>; - fn find_pets_by_status(&self, status: Vec) -> Result, Error>; - fn find_pets_by_tags(&self, tags: Vec) -> Result, Error>; - fn get_pet_by_id(&self, pet_id: i64) -> Result; - fn update_pet(&self, body: crate::models::Pet) -> Result<(), Error>; - fn update_pet_with_form(&self, pet_id: i64, name: Option<&str>, status: Option<&str>) -> Result<(), Error>; - fn upload_file(&self, pet_id: i64, additional_metadata: Option<&str>, file: Option) -> Result; + fn add_pet(&self, body: crate::models::Pet) -> Result, Error>; + fn delete_pet(&self, pet_id: i64, api_key: Option<&str>) -> Result, Error>; + fn find_pets_by_status(&self, status: Vec) -> Result, Error>; + fn find_pets_by_tags(&self, tags: Vec) -> Result, Error>; + fn get_pet_by_id(&self, pet_id: i64) -> Result, Error>; + fn update_pet(&self, body: crate::models::Pet) -> Result, Error>; + fn update_pet_with_form(&self, pet_id: i64, name: Option<&str>, status: Option<&str>) -> Result, Error>; + fn upload_file(&self, pet_id: i64, additional_metadata: Option<&str>, file: Option) -> Result, Error>; } impl PetApi for PetApiClient { - fn add_pet(&self, body: crate::models::Pet) -> Result<(), Error> { + fn add_pet(&self, body: crate::models::Pet) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -58,11 +202,23 @@ impl PetApi for PetApiClient { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn delete_pet(&self, pet_id: i64, api_key: Option<&str>) -> Result<(), Error> { + fn delete_pet(&self, pet_id: i64, api_key: Option<&str>) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -80,11 +236,23 @@ impl PetApi for PetApiClient { }; let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn find_pets_by_status(&self, status: Vec) -> Result, Error> { + fn find_pets_by_status(&self, status: Vec) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -100,10 +268,23 @@ impl PetApi for PetApiClient { }; let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn find_pets_by_tags(&self, tags: Vec) -> Result, Error> { + fn find_pets_by_tags(&self, tags: Vec) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -119,10 +300,23 @@ impl PetApi for PetApiClient { }; let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn get_pet_by_id(&self, pet_id: i64) -> Result { + fn get_pet_by_id(&self, pet_id: i64) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -142,10 +336,23 @@ impl PetApi for PetApiClient { }; let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn update_pet(&self, body: crate::models::Pet) -> Result<(), Error> { + fn update_pet(&self, body: crate::models::Pet) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -161,11 +368,23 @@ impl PetApi for PetApiClient { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn update_pet_with_form(&self, pet_id: i64, name: Option<&str>, status: Option<&str>) -> Result<(), Error> { + fn update_pet_with_form(&self, pet_id: i64, name: Option<&str>, status: Option<&str>) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -188,11 +407,23 @@ impl PetApi for PetApiClient { req_builder = req_builder.form(&form_params); let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn upload_file(&self, pet_id: i64, additional_metadata: Option<&str>, file: Option) -> Result { + fn upload_file(&self, pet_id: i64, additional_metadata: Option<&str>, file: Option) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -215,7 +446,20 @@ impl PetApi for PetApiClient { req_builder = req_builder.multipart(form); let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } } diff --git a/samples/client/petstore/rust/reqwest/petstore/src/apis/store_api.rs b/samples/client/petstore/rust/reqwest/petstore/src/apis/store_api.rs index fee0b120f13f..285d5ee3457c 100644 --- a/samples/client/petstore/rust/reqwest/petstore/src/apis/store_api.rs +++ b/samples/client/petstore/rust/reqwest/petstore/src/apis/store_api.rs @@ -15,6 +15,7 @@ use std::option::Option; use reqwest; +use crate::apis::ResponseContent; use super::{Error, configuration}; pub struct StoreApiClient { @@ -30,15 +31,88 @@ impl StoreApiClient { } +/// struct for typed successes of method `delete_order` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteOrderSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `get_inventory` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetInventorySuccess { + Status200(::std::collections::HashMap), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `get_order_by_id` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrderByIdSuccess { + Status200(crate::models::Order), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `place_order` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PlaceOrderSuccess { + Status200(crate::models::Order), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `delete_order` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteOrderError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `get_inventory` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetInventoryError { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `get_order_by_id` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrderByIdError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `place_order` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PlaceOrderError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + + pub trait StoreApi { - fn delete_order(&self, order_id: &str) -> Result<(), Error>; - fn get_inventory(&self, ) -> Result<::std::collections::HashMap, Error>; - fn get_order_by_id(&self, order_id: i64) -> Result; - fn place_order(&self, body: crate::models::Order) -> Result; + fn delete_order(&self, order_id: &str) -> Result, Error>; + fn get_inventory(&self, ) -> Result, Error>; + fn get_order_by_id(&self, order_id: i64) -> Result, Error>; + fn place_order(&self, body: crate::models::Order) -> Result, Error>; } impl StoreApi for StoreApiClient { - fn delete_order(&self, order_id: &str) -> Result<(), Error> { + fn delete_order(&self, order_id: &str) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -50,11 +124,23 @@ impl StoreApi for StoreApiClient { } let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn get_inventory(&self, ) -> Result<::std::collections::HashMap, Error> { + fn get_inventory(&self, ) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -74,10 +160,23 @@ impl StoreApi for StoreApiClient { }; let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn get_order_by_id(&self, order_id: i64) -> Result { + fn get_order_by_id(&self, order_id: i64) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -89,10 +188,23 @@ impl StoreApi for StoreApiClient { } let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn place_order(&self, body: crate::models::Order) -> Result { + fn place_order(&self, body: crate::models::Order) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -105,7 +217,20 @@ impl StoreApi for StoreApiClient { req_builder = req_builder.json(&body); let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } } diff --git a/samples/client/petstore/rust/reqwest/petstore/src/apis/user_api.rs b/samples/client/petstore/rust/reqwest/petstore/src/apis/user_api.rs index a57be5aa6283..124a810ca123 100644 --- a/samples/client/petstore/rust/reqwest/petstore/src/apis/user_api.rs +++ b/samples/client/petstore/rust/reqwest/petstore/src/apis/user_api.rs @@ -15,6 +15,7 @@ use std::option::Option; use reqwest; +use crate::apis::ResponseContent; use super::{Error, configuration}; pub struct UserApiClient { @@ -30,19 +31,161 @@ impl UserApiClient { } +/// struct for typed successes of method `create_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUserSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `create_users_with_array_input` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUsersWithArrayInputSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `create_users_with_list_input` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUsersWithListInputSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `delete_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteUserSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `get_user_by_name` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserByNameSuccess { + Status200(crate::models::User), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `login_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum LoginUserSuccess { + Status200(String), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `logout_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum LogoutUserSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed successes of method `update_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateUserSuccess { + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `create_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUserError { + DefaultResponse(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `create_users_with_array_input` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUsersWithArrayInputError { + DefaultResponse(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `create_users_with_list_input` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateUsersWithListInputError { + DefaultResponse(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `delete_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteUserError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `get_user_by_name` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserByNameError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `login_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum LoginUserError { + Status400(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `logout_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum LogoutUserError { + DefaultResponse(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `update_user` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateUserError { + Status400(), + Status404(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + + pub trait UserApi { - fn create_user(&self, body: crate::models::User) -> Result<(), Error>; - fn create_users_with_array_input(&self, body: Vec) -> Result<(), Error>; - fn create_users_with_list_input(&self, body: Vec) -> Result<(), Error>; - fn delete_user(&self, username: &str) -> Result<(), Error>; - fn get_user_by_name(&self, username: &str) -> Result; - fn login_user(&self, username: &str, password: &str) -> Result; - fn logout_user(&self, ) -> Result<(), Error>; - fn update_user(&self, username: &str, body: crate::models::User) -> Result<(), Error>; + fn create_user(&self, body: crate::models::User) -> Result, Error>; + fn create_users_with_array_input(&self, body: Vec) -> Result, Error>; + fn create_users_with_list_input(&self, body: Vec) -> Result, Error>; + fn delete_user(&self, username: &str) -> Result, Error>; + fn get_user_by_name(&self, username: &str) -> Result, Error>; + fn login_user(&self, username: &str, password: &str) -> Result, Error>; + fn logout_user(&self, ) -> Result, Error>; + fn update_user(&self, username: &str, body: crate::models::User) -> Result, Error>; } impl UserApi for UserApiClient { - fn create_user(&self, body: crate::models::User) -> Result<(), Error> { + fn create_user(&self, body: crate::models::User) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -55,11 +198,23 @@ impl UserApi for UserApiClient { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn create_users_with_array_input(&self, body: Vec) -> Result<(), Error> { + fn create_users_with_array_input(&self, body: Vec) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -72,11 +227,23 @@ impl UserApi for UserApiClient { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn create_users_with_list_input(&self, body: Vec) -> Result<(), Error> { + fn create_users_with_list_input(&self, body: Vec) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -89,11 +256,23 @@ impl UserApi for UserApiClient { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn delete_user(&self, username: &str) -> Result<(), Error> { + fn delete_user(&self, username: &str) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -105,11 +284,23 @@ impl UserApi for UserApiClient { } let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn get_user_by_name(&self, username: &str) -> Result { + fn get_user_by_name(&self, username: &str) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -121,10 +312,23 @@ impl UserApi for UserApiClient { } let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn login_user(&self, username: &str, password: &str) -> Result { + fn login_user(&self, username: &str, password: &str) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -138,10 +342,23 @@ impl UserApi for UserApiClient { } let req = req_builder.build()?; - Ok(client.execute(req)?.error_for_status()?.json()?) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn logout_user(&self, ) -> Result<(), Error> { + fn logout_user(&self, ) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -153,11 +370,23 @@ impl UserApi for UserApiClient { } let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } - fn update_user(&self, username: &str, body: crate::models::User) -> Result<(), Error> { + fn update_user(&self, username: &str, body: crate::models::User) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -170,8 +399,20 @@ impl UserApi for UserApiClient { req_builder = req_builder.json(&body); let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } } diff --git a/samples/client/petstore/rust/reqwest/petstore/tests/pet_tests.rs b/samples/client/petstore/rust/reqwest/petstore/tests/pet_tests.rs index 61d26eae4490..aa87d2bc6473 100644 --- a/samples/client/petstore/rust/reqwest/petstore/tests/pet_tests.rs +++ b/samples/client/petstore/rust/reqwest/petstore/tests/pet_tests.rs @@ -1,8 +1,7 @@ extern crate petstore_reqwest; -use petstore_reqwest::apis::PetApi; -use petstore_reqwest::apis::PetApiClient; +use petstore_reqwest::apis::pet_api::PetApi; +use petstore_reqwest::apis::pet_api::PetApiClient; use petstore_reqwest::apis::configuration; -//use petstore_reqwest::apis::PetApiUpdatePetWithFormParams; use petstore_reqwest::models::{Pet}; use std::option::Option; use std::rc::Rc; @@ -23,12 +22,22 @@ fn test_pet() { // get pet let pet_result = pet_api_client.get_pet_by_id(8787); - let _pet_result = match pet_result { - Ok(pet) => { - assert_eq!(pet.id, Option::Some(8787)); - assert_eq!(pet.name, "Rust Pet"); - assert_eq!(pet.photo_urls, vec!["https://11".to_string(), "https://22".to_string()]); + match pet_result { + Ok(resp) => { + match resp.entity { + Some(petstore_reqwest::apis::pet_api::GetPetByIdSuccess::Status200(pet)) => { + assert_eq!(pet.id, Option::Some(8787)); + assert_eq!(pet.name, "Rust Pet"); + assert_eq!(pet.photo_urls, vec!["https://11".to_string(), "https://22".to_string()]); + }, + _ => { + panic!("Response should contain a pet entity"); + }, + }; + }, + Err(error) => { + println!("error: {:?}", error); + panic!("Query should succeed"); }, - Err(error) => println!("error: {:?}", error), }; } diff --git a/samples/client/petstore/rust/reqwest/rust-test/src/apis/client.rs b/samples/client/petstore/rust/reqwest/rust-test/src/apis/client.rs index 7566e9e84799..b10fef0b5548 100644 --- a/samples/client/petstore/rust/reqwest/rust-test/src/apis/client.rs +++ b/samples/client/petstore/rust/reqwest/rust-test/src/apis/client.rs @@ -3,7 +3,7 @@ use std::rc::Rc; use super::configuration::Configuration; pub struct APIClient { - default_api: Box, + default_api: Box, } impl APIClient { @@ -11,11 +11,11 @@ impl APIClient { let rc = Rc::new(configuration); APIClient { - default_api: Box::new(crate::apis::DefaultApiClient::new(rc.clone())), + default_api: Box::new(crate::apis::default_api::DefaultApiClient::new(rc.clone())), } } - pub fn default_api(&self) -> &dyn crate::apis::DefaultApi{ + pub fn default_api(&self) -> &dyn crate::apis::default_api::DefaultApi{ self.default_api.as_ref() } diff --git a/samples/client/petstore/rust/reqwest/rust-test/src/apis/default_api.rs b/samples/client/petstore/rust/reqwest/rust-test/src/apis/default_api.rs index 1bb79873dae8..0b3aef583d72 100644 --- a/samples/client/petstore/rust/reqwest/rust-test/src/apis/default_api.rs +++ b/samples/client/petstore/rust/reqwest/rust-test/src/apis/default_api.rs @@ -15,6 +15,7 @@ use std::option::Option; use reqwest; +use crate::apis::ResponseContent; use super::{Error, configuration}; pub struct DefaultApiClient { @@ -30,12 +31,31 @@ impl DefaultApiClient { } +/// struct for typed successes of method `dummy_get` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DummyGetSuccess { + Status200(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method `dummy_get` +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DummyGetError { + DefaultResponse(), + UnknownList(Vec), + UnknownValue(serde_json::Value), +} + + pub trait DefaultApi { - fn dummy_get(&self, ) -> Result<(), Error>; + fn dummy_get(&self, ) -> Result, Error>; } impl DefaultApi for DefaultApiClient { - fn dummy_get(&self, ) -> Result<(), Error> { + fn dummy_get(&self, ) -> Result, Error> { let configuration: &configuration::Configuration = self.configuration.borrow(); let client = &configuration.client; @@ -47,8 +67,20 @@ impl DefaultApi for DefaultApiClient { } let req = req_builder.build()?; - client.execute(req)?.error_for_status()?; - Ok(()) + let mut resp = client.execute(req)?; + + let status = resp.status(); + let content = resp.text()?; + + if status.is_success() { + let entity: Option = serde_json::from_str(&content).ok(); + let result = ResponseContent { status, content, entity }; + Ok(result) + } else { + let entity: Option = serde_json::from_str(&content).ok(); + let error = ResponseContent { status, content, entity }; + Err(Error::ResponseError(error)) + } } } diff --git a/samples/client/petstore/rust/reqwest/rust-test/src/apis/mod.rs b/samples/client/petstore/rust/reqwest/rust-test/src/apis/mod.rs index 77bd60c058a5..0ca4089f9d29 100644 --- a/samples/client/petstore/rust/reqwest/rust-test/src/apis/mod.rs +++ b/samples/client/petstore/rust/reqwest/rust-test/src/apis/mod.rs @@ -1,26 +1,34 @@ use reqwest; use serde_json; +#[derive(Debug, Clone)] +pub struct ResponseContent { + pub status: reqwest::StatusCode, + pub content: String, + pub entity: Option, +} + #[derive(Debug)] -pub enum Error { +pub enum Error { Reqwest(reqwest::Error), Serde(serde_json::Error), Io(std::io::Error), + ResponseError(ResponseContent), } -impl From for Error { +impl From for Error { fn from(e: reqwest::Error) -> Self { Error::Reqwest(e) } } -impl From for Error { +impl From for Error { fn from(e: serde_json::Error) -> Self { Error::Serde(e) } } -impl From for Error { +impl From for Error { fn from(e: std::io::Error) -> Self { Error::Io(e) } @@ -30,8 +38,7 @@ pub fn urlencode>(s: T) -> String { ::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect() } -mod default_api; -pub use self::default_api::{ DefaultApi, DefaultApiClient }; +pub mod default_api; pub mod client; pub mod configuration;