diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java index 32915d8b9807..13f410c2d3d8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java @@ -614,6 +614,10 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation processParam(param, op); } + for (CodegenParameter param : op.queryParams) { + processParam(param, op); + } + // We keep track of the 'default' model type for this API. If there are // *any* XML responses, then we set the default to XML, otherwise we // let the default be JSON. It would be odd for an API to want to use @@ -1064,6 +1068,25 @@ public CodegenParameter fromRequestBody(RequestBody body, Set imports, S return codegenParameter; } + @Override + public void setParameterExampleValue(CodegenParameter codegenParameter, Parameter parameter) { + // Check whether the spec provides an example before calling super, which + // will fall back to auto-generating one from the param name/type. + boolean hasSpecExample = + parameter.getExample() != null || + (parameter.getExamples() != null && !parameter.getExamples().isEmpty()) || + (parameter.getSchema() != null && parameter.getSchema().getExample() != null); + + super.setParameterExampleValue(codegenParameter, parameter); + + if (!hasSpecExample) { + // Null out the auto-generated example so processParam can detect + // required params with no user-provided example and disable the + // client example stub accordingly. + codegenParameter.example = null; + } + } + @Override public String getTypeDeclaration(String name) { return "models::" + name; @@ -1675,15 +1698,30 @@ private void processParam(CodegenParameter param, CodegenOperation op) { example = (param.example != null) ? "&vec![\"" + param.example + "\".to_string()]" : "&Vec::new()"; } else if (param.isString) { param.vendorExtensions.put("x-format-string", "\\\"{}\\\""); - example = "\"" + ((param.example != null) ? param.example : "") + "\".to_string()"; + if (param.example != null) { + example = "\"" + param.example + "\".to_string()"; + } } else if (param.isPrimitiveType) { if ((param.isByteArray) || (param.isBinary)) { // Binary primitive types don't implement `Display`. param.vendorExtensions.put("x-format-string", "{:?}"); example = "swagger::ByteArray(Vec::from(\"" + ((param.example != null) ? param.example : "") + "\"))"; + } else if (param.isBoolean) { + param.vendorExtensions.put("x-format-string", "{}"); + example = (param.example != null) ? param.example : "true"; } else { param.vendorExtensions.put("x-format-string", "{}"); - example = (param.example != null) ? param.example : ""; + if (param.example != null) { + example = param.example; + } else if (param.isFloat || param.isDouble) { + // No example in spec: use the type zero value. This appears only in + // generated client example code. + example = "0.0"; + } else if (param.isInteger || param.isLong || param.isShort || param.isNumber) { + // No example in spec: use the type zero value. This appears only in + // generated client example code. + example = "0"; + } } } else if (param.isArray) { param.vendorExtensions.put("x-format-string", "{:?}"); diff --git a/modules/openapi-generator/src/main/resources/rust-server/example-client-main.mustache b/modules/openapi-generator/src/main/resources/rust-server/example-client-main.mustache index 4c8c9753768b..30f515862c4d 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/example-client-main.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/example-client-main.mustache @@ -44,17 +44,19 @@ fn main() { let matches = Command::new("client") .arg(Arg::new("operation") .help("Sets the operation to run") - .value_parser([ + .value_parser(Vec::<&str>::from([ {{#apiInfo}} {{#apis}} {{#operations}} {{#operation}} + {{^exts.x-no-client-example}} "{{{operationId}}}", + {{/exts.x-no-client-example}} {{/operation}} {{/operations}} {{/apis}} {{/apiInfo}} - ]) + ])) .required(true) .index(1)) .arg(Arg::new("https") diff --git a/modules/openapi-generator/src/main/resources/rust-server/models.mustache b/modules/openapi-generator/src/main/resources/rust-server/models.mustache index 7d14452128cf..3073e56feaf5 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/models.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/models.mustache @@ -146,6 +146,16 @@ impl serde_valid::validation::ValidateCompositedMinLength for {{{classname}}} { Ok(()) } } + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for {{{classname}}} { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} {{/hasConflictingModelNames}} {{#exts.x-to-string-support}} {{#exts.x-is-string}} @@ -432,6 +442,28 @@ pub struct {{{classname}}} { {{/vars}} } +{{^hasConflictingModelNames}} +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for {{{classname}}} { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for {{{classname}}} { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} +{{/hasConflictingModelNames}} + {{#vars}} {{#hasValidation}} {{#pattern}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustServerCodegenTest.java index 6b730cce6f18..d706a7cb2264 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustServerCodegenTest.java @@ -59,4 +59,27 @@ public void testIntegerParameterTypeFitting() throws IOException { // Clean up target.toFile().deleteOnExit(); } + + /** + * Test that required query params without examples disable the client example. + */ + @Test + public void testRequiredQueryParamWithoutExampleDisablesClientExample() throws IOException { + Path target = Files.createTempDirectory("test"); + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("rust-server") + .setInputSpec("src/test/resources/3_0/rust-server/openapi-v3.yaml") + .setSkipOverwrite(false) + .setOutputDir(target.toAbsolutePath().toString().replace("\\", "/")); + List files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate(); + files.forEach(File::deleteOnExit); + + Path exampleClientMain = Path.of(target.toString(), "/examples/client/main.rs"); + TestUtils.assertFileExists(exampleClientMain); + TestUtils.assertFileContains(exampleClientMain, "Disabled because there's no example."); + TestUtils.assertFileContains(exampleClientMain, "Some(\"QueryExampleGet\")"); + + // Clean up + target.toFile().deleteOnExit(); + } } diff --git a/modules/openapi-generator/src/test/resources/2_0/rust-server/rust-server-test.yaml b/modules/openapi-generator/src/test/resources/2_0/rust-server/rust-server-test.yaml index 008604449906..2f7cef964da2 100644 --- a/modules/openapi-generator/src/test/resources/2_0/rust-server/rust-server-test.yaml +++ b/modules/openapi-generator/src/test/resources/2_0/rust-server/rust-server-test.yaml @@ -108,7 +108,6 @@ paths: description: OK schema: $ref: '#/definitions/allOfObject' - parameters: nested_response: name: nested_response diff --git a/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml b/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml index 17b3e06ef359..69ae83c5bd64 100644 --- a/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml @@ -80,6 +80,26 @@ paths: application/json: schema: $ref: "#/components/schemas/anotherXmlObject" + /query-example: + get: + summary: Test required query params with and without examples + operationId: queryExampleGet + parameters: + - name: required_no_example + in: query + required: true + schema: + type: string + - name: required_with_example + in: query + required: true + example: 42 + schema: + type: integer + format: int32 + responses: + 200: + description: OK /multiget: get: summary: Get some stuff. diff --git a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/README.md b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/README.md index 8978c2c6d5b4..12b8e188c5e9 100644 --- a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/README.md +++ b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/README.md @@ -100,6 +100,7 @@ cargo run --example openapi-v3-client MultipleAuthSchemeGet cargo run --example openapi-v3-client OneOfGet cargo run --example openapi-v3-client OverrideServerGet cargo run --example openapi-v3-client ParamgetGet +cargo run --example openapi-v3-client QueryExampleGet cargo run --example openapi-v3-client ReadonlyAuthSchemeGet cargo run --example openapi-v3-client RegisterCallbackPost cargo run --example openapi-v3-client RequiredOctetStreamPut @@ -166,6 +167,7 @@ Method | HTTP request | Description [****](docs/default_api.md#) | **GET** /one-of | [****](docs/default_api.md#) | **GET** /override-server | [****](docs/default_api.md#) | **GET** /paramget | Get some stuff with parameters. +[**queryExampleGet**](docs/default_api.md#queryExampleGet) | **GET** /query-example | Test required query params with and without examples [****](docs/default_api.md#) | **GET** /readonly_auth_scheme | [****](docs/default_api.md#) | **POST** /register-callback | [****](docs/default_api.md#) | **PUT** /required_octet_stream | diff --git a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/api/openapi.yaml b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/api/openapi.yaml index bca81ddc7ef0..e7a49d367f8a 100644 --- a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/api/openapi.yaml +++ b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/api/openapi.yaml @@ -67,6 +67,30 @@ paths: $ref: "#/components/schemas/anotherXmlObject" description: JSON rsp summary: Get some stuff with parameters. + /query-example: + get: + operationId: queryExampleGet + parameters: + - explode: true + in: query + name: required_no_example + required: true + schema: + type: string + style: form + - example: 42 + explode: true + in: query + name: required_with_example + required: true + schema: + format: int32 + type: integer + style: form + responses: + "200": + description: OK + summary: Test required query params with and without examples /multiget: get: responses: diff --git a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/bin/cli.rs b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/bin/cli.rs index 28734b8b7fb3..d2c022bdc3ad 100644 --- a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/bin/cli.rs +++ b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/bin/cli.rs @@ -19,6 +19,7 @@ use openapi_v3::{ OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -151,6 +152,11 @@ enum Operation { #[structopt(parse(try_from_str = parse_json), long)] some_list: Option>, }, + /// Test required query params with and without examples + QueryExampleGet { + required_no_example: String, + required_with_example: i32, + }, ReadonlyAuthSchemeGet { }, RegisterCallbackPost { @@ -546,6 +552,24 @@ async fn main() -> Result<()> { &serde_json::to_string_pretty(&body)?, } } + Operation::QueryExampleGet { + required_no_example, + required_with_example, + } => { + info!("Performing a QueryExampleGet request"); + + let result = client.query_example_get( + required_no_example, + required_with_example, + ).await?; + debug!("Result: {:?}", result); + + match result { + QueryExampleGetResponse::OK + => "OK\n".to_string() + , + } + } Operation::ReadonlyAuthSchemeGet { } => { info!("Performing a ReadonlyAuthSchemeGet request"); diff --git a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/docs/default_api.md b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/docs/default_api.md index 237bfe20109d..0fec99e704d2 100644 --- a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/docs/default_api.md +++ b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/docs/default_api.md @@ -18,6 +18,7 @@ Method | HTTP request | Description ****](default_api.md#) | **GET** /one-of | ****](default_api.md#) | **GET** /override-server | ****](default_api.md#) | **GET** /paramget | Get some stuff with parameters. +**queryExampleGet**](default_api.md#queryExampleGet) | **GET** /query-example | Test required query params with and without examples ****](default_api.md#) | **GET** /readonly_auth_scheme | ****](default_api.md#) | **POST** /register-callback | ****](default_api.md#) | **PUT** /required_octet_stream | @@ -412,6 +413,32 @@ No authorization required [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **queryExampleGet** +> queryExampleGet(required_no_example, required_with_example) +Test required query params with and without examples + +### Required Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **required_no_example** | **String**| | + **required_with_example** | **i32**| | + +### Return type + + (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **** > (ctx, ) diff --git a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/examples/client/main.rs b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/examples/client/main.rs index d4b93615cfd5..b728a07075ac 100644 --- a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/examples/client/main.rs +++ b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/examples/client/main.rs @@ -20,6 +20,7 @@ use openapi_v3::{Api, ApiNoContext, Claims, Client, ContextWrapperExt, models, OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -79,6 +80,7 @@ fn main() { "OneOfGet", "OverrideServerGet", "ParamgetGet", + "QueryExampleGet", "ReadonlyAuthSchemeGet", "RegisterCallbackPost", "RequiredOctetStreamPut", @@ -254,6 +256,13 @@ fn main() { )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + Some("QueryExampleGet") => { + let result = rt.block_on(client.query_example_get( + "required_no_example_example".to_string(), + 42 + )); + info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); + }, Some("ReadonlyAuthSchemeGet") => { let result = rt.block_on(client.readonly_auth_scheme_get( )); diff --git a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/examples/server/server.rs b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/examples/server/server.rs index b23193f3fe6f..1bcc542e1177 100644 --- a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/examples/server/server.rs +++ b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/examples/server/server.rs @@ -116,6 +116,7 @@ use openapi_v3::{ OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -255,6 +256,16 @@ impl Api for Server where C: Has + Send + Sync info!("paramget_get({:?}, {:?}, {:?}) - X-Span-ID: {:?}", uuid, some_object, some_list, context.get().0.clone()); Err(ApiError("Api-Error: Operation is NOT implemented".into())) } + /// Test required query params with and without examples + async fn query_example_get( + &self, + required_no_example: String, + required_with_example: i32, + context: &C) -> Result + { + info!("query_example_get(\"{}\", {}) - X-Span-ID: {:?}", required_no_example, required_with_example, context.get().0.clone()); + Err(ApiError("Api-Error: Operation is NOT implemented".into())) + } async fn readonly_auth_scheme_get( &self, context: &C) -> Result diff --git a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/client/mod.rs b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/client/mod.rs index 8e7ed37f37f6..d8fc3bac71b5 100644 --- a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/client/mod.rs +++ b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/client/mod.rs @@ -52,6 +52,7 @@ use crate::{Api, OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -1600,6 +1601,77 @@ impl Api for Client where } } } + async fn query_example_get( + &self, + param_required_no_example: String, + param_required_with_example: i32, + context: &C) -> Result + { + let mut client_service = self.client_service.clone(); + #[allow(clippy::uninlined_format_args)] + let mut uri = format!( + "{}/query-example", + self.base_path + ); + + // Query parameters + let query_string = { + let mut query_string = form_urlencoded::Serializer::new("".to_owned()); + query_string.append_pair("required_no_example", + ¶m_required_no_example); + query_string.append_pair("required_with_example", + ¶m_required_with_example.to_string()); + query_string.finish() + }; + if !query_string.is_empty() { + uri += "?"; + uri += &query_string; + } + + let uri = match Uri::from_str(&uri) { + Ok(uri) => uri, + Err(err) => return Err(ApiError(format!("Unable to build URI: {err}"))), + }; + + let mut request = match Request::builder() + .method("GET") + .uri(uri) + .body(Body::empty()) { + Ok(req) => req, + Err(e) => return Err(ApiError(format!("Unable to create request: {e}"))) + }; + let header = HeaderValue::from_str(Has::::get(context).0.as_str()); + request.headers_mut().insert(HeaderName::from_static("x-span-id"), match header { + Ok(h) => h, + Err(e) => return Err(ApiError(format!("Unable to create X-Span ID header value: {e}"))) + }); + + let response = client_service.call((request, context.clone())) + .map_err(|e| ApiError(format!("No response received: {e}"))).await?; + + match response.status().as_u16() { + 200 => { + Ok( + QueryExampleGetResponse::OK + ) + } + code => { + let headers = response.headers().clone(); + let body = response.into_body() + .take(100) + .into_raw().await; + Err(ApiError(format!("Unexpected response code {code}:\n{headers:?}\n\n{}", + match body { + Ok(body) => match String::from_utf8(body) { + Ok(body) => body, + Err(e) => format!(""), + }, + Err(e) => format!(""), + } + ))) + } + } + } async fn readonly_auth_scheme_get( &self, context: &C) -> Result diff --git a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/lib.rs b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/lib.rs index 65e5f47282dc..177f2b7bd156 100644 --- a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/lib.rs +++ b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/lib.rs @@ -129,6 +129,11 @@ pub enum ParamgetGetResponse { (models::AnotherXmlObject) } #[derive(Debug, PartialEq, Serialize, Deserialize)] +pub enum QueryExampleGetResponse { + /// OK + OK +} +#[derive(Debug, PartialEq, Serialize, Deserialize)] pub enum ReadonlyAuthSchemeGetResponse { /// Check that limiting to a single required auth scheme works CheckThatLimitingToASingleRequiredAuthSchemeWorks @@ -356,6 +361,13 @@ pub trait Api { some_list: Option<&Vec>, context: &C) -> Result; + /// Test required query params with and without examples + async fn query_example_get( + &self, + required_no_example: String, + required_with_example: i32, + context: &C) -> Result; + async fn readonly_auth_scheme_get( &self, context: &C) -> Result; @@ -523,6 +535,13 @@ pub trait ApiNoContext { some_list: Option<&Vec>, ) -> Result; + /// Test required query params with and without examples + async fn query_example_get( + &self, + required_no_example: String, + required_with_example: i32, + ) -> Result; + async fn readonly_auth_scheme_get( &self, ) -> Result; @@ -760,6 +779,17 @@ impl + Send + Sync, C: Clone + Send + Sync> ApiNoContext for Contex self.api().paramget_get(uuid, some_object, some_list, &context).await } + /// Test required query params with and without examples + async fn query_example_get( + &self, + required_no_example: String, + required_with_example: i32, + ) -> Result + { + let context = self.context().clone(); + self.api().query_example_get(required_no_example, required_with_example, &context).await + } + async fn readonly_auth_scheme_get( &self, ) -> Result diff --git a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/server/mod.rs b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/server/mod.rs index a485bf0ab239..692f1e2b2d37 100644 --- a/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/server/mod.rs +++ b/samples/server/petstore/rust-server-deprecated/output/openapi-v3/src/server/mod.rs @@ -38,6 +38,7 @@ use crate::{Api, OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -83,6 +84,7 @@ mod paths { r"^/operation-two-first-letter-headers$", r"^/override-server$", r"^/paramget$", + r"^/query-example$", r"^/readonly_auth_scheme$", r"^/register-callback$", r"^/repos$", @@ -127,24 +129,25 @@ mod paths { pub(crate) static ID_OPERATION_TWO_FIRST_LETTER_HEADERS: usize = 14; pub(crate) static ID_OVERRIDE_SERVER: usize = 15; pub(crate) static ID_PARAMGET: usize = 16; - pub(crate) static ID_READONLY_AUTH_SCHEME: usize = 17; - pub(crate) static ID_REGISTER_CALLBACK: usize = 18; - pub(crate) static ID_REPOS: usize = 19; - pub(crate) static ID_REPOS_REPOID: usize = 20; + pub(crate) static ID_QUERY_EXAMPLE: usize = 17; + pub(crate) static ID_READONLY_AUTH_SCHEME: usize = 18; + pub(crate) static ID_REGISTER_CALLBACK: usize = 19; + pub(crate) static ID_REPOS: usize = 20; + pub(crate) static ID_REPOS_REPOID: usize = 21; lazy_static! { pub static ref REGEX_REPOS_REPOID: regex::Regex = #[allow(clippy::invalid_regex)] regex::Regex::new(r"^/repos/(?P[^/?#]*)$") .expect("Unable to create regex for REPOS_REPOID"); } - pub(crate) static ID_REQUIRED_OCTET_STREAM: usize = 21; - pub(crate) static ID_RESPONSES_WITH_HEADERS: usize = 22; - pub(crate) static ID_RFC7807: usize = 23; - pub(crate) static ID_UNTYPED_PROPERTY: usize = 24; - pub(crate) static ID_UUID: usize = 25; - pub(crate) static ID_XML: usize = 26; - pub(crate) static ID_XML_EXTRA: usize = 27; - pub(crate) static ID_XML_OTHER: usize = 28; + pub(crate) static ID_REQUIRED_OCTET_STREAM: usize = 22; + pub(crate) static ID_RESPONSES_WITH_HEADERS: usize = 23; + pub(crate) static ID_RFC7807: usize = 24; + pub(crate) static ID_UNTYPED_PROPERTY: usize = 25; + pub(crate) static ID_UUID: usize = 26; + pub(crate) static ID_XML: usize = 27; + pub(crate) static ID_XML_EXTRA: usize = 28; + pub(crate) static ID_XML_OTHER: usize = 29; } pub struct MakeService where @@ -1007,6 +1010,87 @@ impl hyper::service::Service<(Request, C)> for Service where Ok(response) }, + // QueryExampleGet - GET /query-example + hyper::Method::GET if path.matched(paths::ID_QUERY_EXAMPLE) => { + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = form_urlencoded::parse(uri.query().unwrap_or_default().as_bytes()).collect::>(); + let param_required_no_example = query_params.iter().filter(|e| e.0 == "required_no_example").map(|e| e.1.clone()) + .next(); + let param_required_no_example = match param_required_no_example { + Some(param_required_no_example) => { + let param_required_no_example = + ::from_str + (¶m_required_no_example); + match param_required_no_example { + Ok(param_required_no_example) => Some(param_required_no_example), + Err(e) => return Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(Body::from(format!("Couldn't parse query parameter required_no_example - doesn't match schema: {e}"))) + .expect("Unable to create Bad Request response for invalid query parameter required_no_example")), + } + }, + None => None, + }; + let param_required_no_example = match param_required_no_example { + Some(param_required_no_example) => param_required_no_example, + None => return Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(Body::from("Missing required query parameter required_no_example")) + .expect("Unable to create Bad Request response for missing query parameter required_no_example")), + }; + let param_required_with_example = query_params.iter().filter(|e| e.0 == "required_with_example").map(|e| e.1.clone()) + .next(); + let param_required_with_example = match param_required_with_example { + Some(param_required_with_example) => { + let param_required_with_example = + ::from_str + (¶m_required_with_example); + match param_required_with_example { + Ok(param_required_with_example) => Some(param_required_with_example), + Err(e) => return Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(Body::from(format!("Couldn't parse query parameter required_with_example - doesn't match schema: {e}"))) + .expect("Unable to create Bad Request response for invalid query parameter required_with_example")), + } + }, + None => None, + }; + let param_required_with_example = match param_required_with_example { + Some(param_required_with_example) => param_required_with_example, + None => return Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(Body::from("Missing required query parameter required_with_example")) + .expect("Unable to create Bad Request response for missing query parameter required_with_example")), + }; + + let result = api_impl.query_example_get( + param_required_no_example, + param_required_with_example, + &context + ).await; + let mut response = Response::new(Body::empty()); + response.headers_mut().insert( + HeaderName::from_static("x-span-id"), + HeaderValue::from_str((&context as &dyn Has).get().0.clone().as_str()) + .expect("Unable to create X-Span-ID header value")); + + match result { + Ok(rsp) => match rsp { + QueryExampleGetResponse::OK + => { + *response.status_mut() = StatusCode::from_u16(200).expect("Unable to turn 200 into a StatusCode"); + }, + }, + Err(_) => { + // Application code returned an error. This should not happen, as the implementation should + // return a valid response. + *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; + *response.body_mut() = Body::from("An internal error occurred"); + }, + } + + Ok(response) + }, // ReadonlyAuthSchemeGet - GET /readonly_auth_scheme hyper::Method::GET if path.matched(paths::ID_READONLY_AUTH_SCHEME) => { { @@ -2119,6 +2203,7 @@ impl hyper::service::Service<(Request, C)> for Service where _ if path.matched(paths::ID_OPERATION_TWO_FIRST_LETTER_HEADERS) => method_not_allowed(), _ if path.matched(paths::ID_OVERRIDE_SERVER) => method_not_allowed(), _ if path.matched(paths::ID_PARAMGET) => method_not_allowed(), + _ if path.matched(paths::ID_QUERY_EXAMPLE) => method_not_allowed(), _ if path.matched(paths::ID_READONLY_AUTH_SCHEME) => method_not_allowed(), _ if path.matched(paths::ID_REGISTER_CALLBACK) => method_not_allowed(), _ if path.matched(paths::ID_REPOS) => method_not_allowed(), @@ -2176,6 +2261,8 @@ impl RequestParser for ApiRequestParser { hyper::Method::GET if path.matched(paths::ID_OVERRIDE_SERVER) => Some("OverrideServerGet"), // ParamgetGet - GET /paramget hyper::Method::GET if path.matched(paths::ID_PARAMGET) => Some("ParamgetGet"), + // QueryExampleGet - GET /query-example + hyper::Method::GET if path.matched(paths::ID_QUERY_EXAMPLE) => Some("QueryExampleGet"), // ReadonlyAuthSchemeGet - GET /readonly_auth_scheme hyper::Method::GET if path.matched(paths::ID_READONLY_AUTH_SCHEME) => Some("ReadonlyAuthSchemeGet"), // RegisterCallbackPost - POST /register-callback diff --git a/samples/server/petstore/rust-server/output/multipart-v3/examples/client/main.rs b/samples/server/petstore/rust-server/output/multipart-v3/examples/client/main.rs index 7aecfea8630f..9357df4ab57a 100644 --- a/samples/server/petstore/rust-server/output/multipart-v3/examples/client/main.rs +++ b/samples/server/petstore/rust-server/output/multipart-v3/examples/client/main.rs @@ -35,11 +35,11 @@ fn main() { let matches = Command::new("client") .arg(Arg::new("operation") .help("Sets the operation to run") - .value_parser([ + .value_parser(Vec::<&str>::from([ "MultipartRelatedRequestPost", "MultipartRequestPost", "MultipleIdenticalMimeTypesPost", - ]) + ])) .required(true) .index(1)) .arg(Arg::new("https") diff --git a/samples/server/petstore/rust-server/output/multipart-v3/src/models.rs b/samples/server/petstore/rust-server/output/multipart-v3/src/models.rs index 99f65c171257..60eefc819d75 100644 --- a/samples/server/petstore/rust-server/output/multipart-v3/src/models.rs +++ b/samples/server/petstore/rust-server/output/multipart-v3/src/models.rs @@ -28,6 +28,26 @@ pub struct MultipartRelatedRequest { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for MultipartRelatedRequest { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for MultipartRelatedRequest { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl MultipartRelatedRequest { #[allow(clippy::new_without_default)] @@ -199,6 +219,26 @@ pub struct MultipartRequestObjectField { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for MultipartRequestObjectField { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for MultipartRequestObjectField { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl MultipartRequestObjectField { #[allow(clippy::new_without_default)] @@ -372,6 +412,26 @@ pub struct MultipleIdenticalMimeTypesPostRequest { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for MultipleIdenticalMimeTypesPostRequest { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for MultipleIdenticalMimeTypesPostRequest { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl MultipleIdenticalMimeTypesPostRequest { #[allow(clippy::new_without_default)] diff --git a/samples/server/petstore/rust-server/output/no-example-v3/examples/client/main.rs b/samples/server/petstore/rust-server/output/no-example-v3/examples/client/main.rs index dcb6aa15a9ca..abdecc1c0016 100644 --- a/samples/server/petstore/rust-server/output/no-example-v3/examples/client/main.rs +++ b/samples/server/petstore/rust-server/output/no-example-v3/examples/client/main.rs @@ -33,9 +33,8 @@ fn main() { let matches = Command::new("client") .arg(Arg::new("operation") .help("Sets the operation to run") - .value_parser([ - "OpGet", - ]) + .value_parser(Vec::<&str>::from([ + ])) .required(true) .index(1)) .arg(Arg::new("https") diff --git a/samples/server/petstore/rust-server/output/no-example-v3/src/models.rs b/samples/server/petstore/rust-server/output/no-example-v3/src/models.rs index 584da04627f6..f2f7c683270e 100644 --- a/samples/server/petstore/rust-server/output/no-example-v3/src/models.rs +++ b/samples/server/petstore/rust-server/output/no-example-v3/src/models.rs @@ -17,6 +17,26 @@ pub struct OpGetRequest { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for OpGetRequest { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for OpGetRequest { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl OpGetRequest { #[allow(clippy::new_without_default)] diff --git a/samples/server/petstore/rust-server/output/openapi-v3/README.md b/samples/server/petstore/rust-server/output/openapi-v3/README.md index a52e3eed3d32..3adf55a45615 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/README.md +++ b/samples/server/petstore/rust-server/output/openapi-v3/README.md @@ -87,13 +87,11 @@ To run a client, follow one of the following simple steps: ``` cargo run --example openapi-v3-client AnyOfGet -cargo run --example openapi-v3-client CallbackWithHeaderPost cargo run --example openapi-v3-client ComplexQueryParamGet cargo run --example openapi-v3-client ExamplesTest cargo run --example openapi-v3-client FormTest cargo run --example openapi-v3-client GetWithBooleanParameter cargo run --example openapi-v3-client JsonComplexQueryParamGet -cargo run --example openapi-v3-client MandatoryRequestHeaderGet cargo run --example openapi-v3-client MergePatchJsonGet cargo run --example openapi-v3-client MultigetGet cargo run --example openapi-v3-client MultipleAuthSchemeGet @@ -101,7 +99,6 @@ cargo run --example openapi-v3-client OneOfGet cargo run --example openapi-v3-client OverrideServerGet cargo run --example openapi-v3-client ParamgetGet cargo run --example openapi-v3-client ReadonlyAuthSchemeGet -cargo run --example openapi-v3-client RegisterCallbackPost cargo run --example openapi-v3-client RequiredOctetStreamPut cargo run --example openapi-v3-client ResponsesWithHeadersGet cargo run --example openapi-v3-client Rfc7807Get @@ -114,9 +111,7 @@ cargo run --example openapi-v3-client XmlOtherPut cargo run --example openapi-v3-client XmlPost cargo run --example openapi-v3-client XmlPut cargo run --example openapi-v3-client EnumInPathPathParamGet -cargo run --example openapi-v3-client MultiplePathParamsWithVeryLongPathToTestFormattingPathParamAPathParamBGet cargo run --example openapi-v3-client CreateRepo -cargo run --example openapi-v3-client GetRepoInfo ``` ### HTTPS @@ -192,6 +187,7 @@ Method | HTTP request | Description [****](docs/default_api.md#) | **GET** /one-of | [****](docs/default_api.md#) | **GET** /override-server | [****](docs/default_api.md#) | **GET** /paramget | Get some stuff with parameters. +[**queryExampleGet**](docs/default_api.md#queryExampleGet) | **GET** /query-example | Test required query params with and without examples [****](docs/default_api.md#) | **GET** /readonly_auth_scheme | [****](docs/default_api.md#) | **POST** /register-callback | [****](docs/default_api.md#) | **PUT** /required_octet_stream | diff --git a/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml b/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml index bca81ddc7ef0..e7a49d367f8a 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml +++ b/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml @@ -67,6 +67,30 @@ paths: $ref: "#/components/schemas/anotherXmlObject" description: JSON rsp summary: Get some stuff with parameters. + /query-example: + get: + operationId: queryExampleGet + parameters: + - explode: true + in: query + name: required_no_example + required: true + schema: + type: string + style: form + - example: 42 + explode: true + in: query + name: required_with_example + required: true + schema: + format: int32 + type: integer + style: form + responses: + "200": + description: OK + summary: Test required query params with and without examples /multiget: get: responses: diff --git a/samples/server/petstore/rust-server/output/openapi-v3/bin/cli.rs b/samples/server/petstore/rust-server/output/openapi-v3/bin/cli.rs index 271d62349e7f..8e7ab7a96cb6 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/bin/cli.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/bin/cli.rs @@ -20,6 +20,7 @@ use openapi_v3::{ OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -151,6 +152,11 @@ enum Operation { #[clap(value_parser = parse_json::)] some_list: Option, }, + /// Test required query params with and without examples + QueryExampleGet { + required_no_example: String, + required_with_example: i32, + }, ReadonlyAuthSchemeGet { }, RegisterCallbackPost { @@ -554,6 +560,24 @@ async fn main() -> Result<()> { &serde_json::to_string_pretty(&body)?, } } + Operation::QueryExampleGet { + required_no_example, + required_with_example, + } => { + info!("Performing a QueryExampleGet request"); + + let result = client.query_example_get( + required_no_example, + required_with_example, + ).await?; + debug!("Result: {:?}", result); + + match result { + QueryExampleGetResponse::OK + => "OK\n".to_string() + , + } + } Operation::ReadonlyAuthSchemeGet { } => { info!("Performing a ReadonlyAuthSchemeGet request"); diff --git a/samples/server/petstore/rust-server/output/openapi-v3/docs/default_api.md b/samples/server/petstore/rust-server/output/openapi-v3/docs/default_api.md index 621325c0ea84..2e0108f7f2e5 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/docs/default_api.md +++ b/samples/server/petstore/rust-server/output/openapi-v3/docs/default_api.md @@ -18,6 +18,7 @@ Method | HTTP request | Description ****](default_api.md#) | **GET** /one-of | ****](default_api.md#) | **GET** /override-server | ****](default_api.md#) | **GET** /paramget | Get some stuff with parameters. +**queryExampleGet**](default_api.md#queryExampleGet) | **GET** /query-example | Test required query params with and without examples ****](default_api.md#) | **GET** /readonly_auth_scheme | ****](default_api.md#) | **POST** /register-callback | ****](default_api.md#) | **PUT** /required_octet_stream | @@ -412,6 +413,32 @@ No authorization required [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **queryExampleGet** +> queryExampleGet(required_no_example, required_with_example) +Test required query params with and without examples + +### Required Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **required_no_example** | **String**| | + **required_with_example** | **i32**| | + +### Return type + + (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **** > (ctx, ) diff --git a/samples/server/petstore/rust-server/output/openapi-v3/examples/client/main.rs b/samples/server/petstore/rust-server/output/openapi-v3/examples/client/main.rs index 1af6586cb53f..0ee7292ba787 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/examples/client/main.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/examples/client/main.rs @@ -20,6 +20,7 @@ use openapi_v3::{Api, ApiNoContext, Claims, Client, ContextWrapperExt, models, OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -64,15 +65,13 @@ fn main() { let matches = Command::new("client") .arg(Arg::new("operation") .help("Sets the operation to run") - .value_parser([ + .value_parser(Vec::<&str>::from([ "AnyOfGet", - "CallbackWithHeaderPost", "ComplexQueryParamGet", "ExamplesTest", "FormTest", "GetWithBooleanParameter", "JsonComplexQueryParamGet", - "MandatoryRequestHeaderGet", "MergePatchJsonGet", "MultigetGet", "MultipleAuthSchemeGet", @@ -80,7 +79,6 @@ fn main() { "OverrideServerGet", "ParamgetGet", "ReadonlyAuthSchemeGet", - "RegisterCallbackPost", "RequiredOctetStreamPut", "ResponsesWithHeadersGet", "Rfc7807Get", @@ -93,10 +91,8 @@ fn main() { "XmlPost", "XmlPut", "EnumInPathPathParamGet", - "MultiplePathParamsWithVeryLongPathToTestFormattingPathParamAPathParamBGet", "CreateRepo", - "GetRepoInfo", - ]) + ])) .required(true) .index(1)) .arg(Arg::new("https") @@ -192,12 +188,14 @@ fn main() { )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + /* Disabled because there's no example. Some("CallbackWithHeaderPost") => { let result = rt.block_on(client.callback_with_header_post( - "url_example".to_string() + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ Some("ComplexQueryParamGet") => { let result = rt.block_on(client.complex_query_param_get( Some(&Vec::new()) @@ -229,12 +227,14 @@ fn main() { )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + /* Disabled because there's no example. Some("MandatoryRequestHeaderGet") => { let result = rt.block_on(client.mandatory_request_header_get( - "x_header_example".to_string() + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ Some("MergePatchJsonGet") => { let result = rt.block_on(client.merge_patch_json_get( )); @@ -262,23 +262,34 @@ fn main() { }, Some("ParamgetGet") => { let result = rt.block_on(client.paramget_get( - Some(serde_json::from_str::(r#"38400000-8cf0-11bd-b23e-10b96e4ef00d"#).expect("Failed to parse JSON example")), + None, None, None )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + /* Disabled because there's no example. + Some("QueryExampleGet") => { + let result = rt.block_on(client.query_example_get( + ???, + 42 + )); + info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); + }, + */ Some("ReadonlyAuthSchemeGet") => { let result = rt.block_on(client.readonly_auth_scheme_get( )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + /* Disabled because there's no example. Some("RegisterCallbackPost") => { let result = rt.block_on(client.register_callback_post( - "url_example".to_string() + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ Some("RequiredOctetStreamPut") => { let result = rt.block_on(client.required_octet_stream_put( swagger::ByteArray(Vec::from("BYTE_ARRAY_DATA_HERE")) @@ -349,25 +360,29 @@ fn main() { )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + /* Disabled because there's no example. Some("MultiplePathParamsWithVeryLongPathToTestFormattingPathParamAPathParamBGet") => { let result = rt.block_on(client.multiple_path_params_with_very_long_path_to_test_formatting_path_param_a_path_param_b_get( - "path_param_a_example".to_string(), - "path_param_b_example".to_string() + ???, + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ Some("CreateRepo") => { let result = rt.block_on(client.create_repo( serde_json::from_str::(r#"{"requiredParam":true}"#).expect("Failed to parse JSON example") )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + /* Disabled because there's no example. Some("GetRepoInfo") => { let result = rt.block_on(client.get_repo_info( - "repo_id_example".to_string() + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ _ => { panic!("Invalid operation provided") } diff --git a/samples/server/petstore/rust-server/output/openapi-v3/examples/server/server.rs b/samples/server/petstore/rust-server/output/openapi-v3/examples/server/server.rs index 93926b52645d..6e4b73c6adc3 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/examples/server/server.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/examples/server/server.rs @@ -151,6 +151,7 @@ use openapi_v3::{ OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -304,6 +305,17 @@ impl Api for Server where C: Has + Send + Sync Err(ApiError("Api-Error: Operation is NOT implemented".into())) } + /// Test required query params with and without examples + async fn query_example_get( + &self, + required_no_example: String, + required_with_example: i32, + context: &C) -> Result + { + info!("query_example_get(\"{}\", {}) - X-Span-ID: {:?}", required_no_example, required_with_example, context.get().0.clone()); + Err(ApiError("Api-Error: Operation is NOT implemented".into())) + } + async fn readonly_auth_scheme_get( &self, context: &C) -> Result diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs index 69bb9ca56cc6..c85c3207b1f3 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs @@ -53,6 +53,7 @@ use crate::{Api, OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -1727,6 +1728,80 @@ impl Api for Client where } } + #[allow(clippy::vec_init_then_push)] + async fn query_example_get( + &self, + param_required_no_example: String, + param_required_with_example: i32, + context: &C) -> Result + { + let mut client_service = self.client_service.clone(); + #[allow(clippy::uninlined_format_args)] + let mut uri = format!( + "{}/query-example", + self.base_path + ); + + // Query parameters + let query_string = { + let mut query_string = form_urlencoded::Serializer::new("".to_owned()); + query_string.append_pair("required_no_example", + ¶m_required_no_example); + query_string.append_pair("required_with_example", + ¶m_required_with_example.to_string()); + query_string.finish() + }; + if !query_string.is_empty() { + uri += "?"; + uri += &query_string; + } + + let uri = match Uri::from_str(&uri) { + Ok(uri) => uri, + Err(err) => return Err(ApiError(format!("Unable to build URI: {err}"))), + }; + + let mut request = match Request::builder() + .method("GET") + .uri(uri) + .body(BoxBody::new(http_body_util::Empty::new())) { + Ok(req) => req, + Err(e) => return Err(ApiError(format!("Unable to create request: {e}"))) + }; + + let header = HeaderValue::from_str(Has::::get(context).0.as_str()); + request.headers_mut().insert(HeaderName::from_static("x-span-id"), match header { + Ok(h) => h, + Err(e) => return Err(ApiError(format!("Unable to create X-Span ID header value: {e}"))) + }); + + let response = client_service.call((request, context.clone())) + .map_err(|e| ApiError(format!("No response received: {e}"))).await?; + + match response.status().as_u16() { + 200 => { + Ok( + QueryExampleGetResponse::OK + ) + } + code => { + let headers = response.headers().clone(); + let body = http_body_util::BodyExt::collect(response.into_body()) + .await + .map(|f| f.to_bytes().to_vec()); + Err(ApiError(format!("Unexpected response code {code}:\n{headers:?}\n\n{}", + match body { + Ok(body) => match String::from_utf8(body) { + Ok(body) => body, + Err(e) => format!(""), + }, + Err(e) => format!("", Into::::into(e)), + } + ))) + } + } + } + #[allow(clippy::vec_init_then_push)] async fn readonly_auth_scheme_get( &self, diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/lib.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/lib.rs index cf15134bdda5..1e9f566f5616 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/lib.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/lib.rs @@ -145,6 +145,12 @@ pub enum ParamgetGetResponse { (models::AnotherXmlObject) } +#[derive(Debug, PartialEq, Serialize, Deserialize)] +pub enum QueryExampleGetResponse { + /// OK + OK +} + #[derive(Debug, PartialEq, Serialize, Deserialize)] pub enum ReadonlyAuthSchemeGetResponse { /// Check that limiting to a single required auth scheme works @@ -387,6 +393,13 @@ pub trait Api { some_list: Option, context: &C) -> Result; + /// Test required query params with and without examples + async fn query_example_get( + &self, + required_no_example: String, + required_with_example: i32, + context: &C) -> Result; + async fn readonly_auth_scheme_get( &self, context: &C) -> Result; @@ -557,6 +570,13 @@ pub trait ApiNoContext { some_list: Option, ) -> Result; + /// Test required query params with and without examples + async fn query_example_get( + &self, + required_no_example: String, + required_with_example: i32, + ) -> Result; + async fn readonly_auth_scheme_get( &self, ) -> Result; @@ -790,6 +810,17 @@ impl + Send + Sync, C: Clone + Send + Sync> ApiNoContext for Contex self.api().paramget_get(uuid, some_object, some_list, &context).await } + /// Test required query params with and without examples + async fn query_example_get( + &self, + required_no_example: String, + required_with_example: i32, + ) -> Result + { + let context = self.context().clone(); + self.api().query_example_get(required_no_example, required_with_example, &context).await + } + async fn readonly_auth_scheme_get( &self, ) -> Result diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/models.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/models.rs index 4fb4c803c5ae..b749aecb8a37 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/models.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/models.rs @@ -304,6 +304,7 @@ pub struct AdditionalPropertiesWithNullable { } + impl AdditionalPropertiesWithNullable { #[allow(clippy::new_without_default)] pub fn new() -> AdditionalPropertiesWithNullable { @@ -809,6 +810,7 @@ pub struct AnotherXmlObject { } + impl AnotherXmlObject { #[allow(clippy::new_without_default)] pub fn new() -> AnotherXmlObject { @@ -1539,6 +1541,7 @@ pub struct AnyOfProperty { } + impl AnyOfProperty { #[allow(clippy::new_without_default)] pub fn new(required_any_of: models::AnyOfObject, ) -> AnyOfProperty { @@ -1718,6 +1721,7 @@ pub struct DuplicateXmlObject { } + impl DuplicateXmlObject { #[allow(clippy::new_without_default)] pub fn new(inner_array: models::XmlArray, ) -> DuplicateXmlObject { @@ -2683,6 +2687,7 @@ pub struct MultigetGet201Response { } + impl MultigetGet201Response { #[allow(clippy::new_without_default)] pub fn new() -> MultigetGet201Response { @@ -3500,6 +3505,7 @@ pub struct NullableTest { } + impl NullableTest { #[allow(clippy::new_without_default)] pub fn new(nullable: swagger::Nullable, ) -> NullableTest { @@ -3740,6 +3746,7 @@ pub struct ObjectHeader { } + impl ObjectHeader { #[allow(clippy::new_without_default)] pub fn new(required_object_header: bool, ) -> ObjectHeader { @@ -3925,6 +3932,7 @@ pub struct ObjectParam { } + impl ObjectParam { #[allow(clippy::new_without_default)] pub fn new(required_param: bool, ) -> ObjectParam { @@ -4116,6 +4124,7 @@ pub struct ObjectUntypedProps { } + impl ObjectUntypedProps { #[allow(clippy::new_without_default)] pub fn new(required_untyped: serde_json::Value, required_untyped_nullable: swagger::Nullable, ) -> ObjectUntypedProps { @@ -4299,6 +4308,7 @@ pub struct ObjectWithArrayOfObjects { } + impl ObjectWithArrayOfObjects { #[allow(clippy::new_without_default)] pub fn new() -> ObjectWithArrayOfObjects { @@ -5890,6 +5900,7 @@ pub struct XmlObject { } + impl XmlObject { #[allow(clippy::new_without_default)] pub fn new() -> XmlObject { diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs index c2c3b8a2337c..04ce905c268f 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs @@ -39,6 +39,7 @@ use crate::{Api, OneOfGetResponse, OverrideServerGetResponse, ParamgetGetResponse, + QueryExampleGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, RequiredOctetStreamPutResponse, @@ -84,6 +85,7 @@ mod paths { r"^/operation-two-first-letter-headers$", r"^/override-server$", r"^/paramget$", + r"^/query-example$", r"^/readonly_auth_scheme$", r"^/register-callback$", r"^/repos$", @@ -128,24 +130,25 @@ mod paths { pub(crate) static ID_OPERATION_TWO_FIRST_LETTER_HEADERS: usize = 14; pub(crate) static ID_OVERRIDE_SERVER: usize = 15; pub(crate) static ID_PARAMGET: usize = 16; - pub(crate) static ID_READONLY_AUTH_SCHEME: usize = 17; - pub(crate) static ID_REGISTER_CALLBACK: usize = 18; - pub(crate) static ID_REPOS: usize = 19; - pub(crate) static ID_REPOS_REPOID: usize = 20; + pub(crate) static ID_QUERY_EXAMPLE: usize = 17; + pub(crate) static ID_READONLY_AUTH_SCHEME: usize = 18; + pub(crate) static ID_REGISTER_CALLBACK: usize = 19; + pub(crate) static ID_REPOS: usize = 20; + pub(crate) static ID_REPOS_REPOID: usize = 21; lazy_static! { pub static ref REGEX_REPOS_REPOID: regex::Regex = #[allow(clippy::invalid_regex)] regex::Regex::new(r"^/repos/(?P[^/?#]*)$") .expect("Unable to create regex for REPOS_REPOID"); } - pub(crate) static ID_REQUIRED_OCTET_STREAM: usize = 21; - pub(crate) static ID_RESPONSES_WITH_HEADERS: usize = 22; - pub(crate) static ID_RFC7807: usize = 23; - pub(crate) static ID_UNTYPED_PROPERTY: usize = 24; - pub(crate) static ID_UUID: usize = 25; - pub(crate) static ID_XML: usize = 26; - pub(crate) static ID_XML_EXTRA: usize = 27; - pub(crate) static ID_XML_OTHER: usize = 28; + pub(crate) static ID_REQUIRED_OCTET_STREAM: usize = 22; + pub(crate) static ID_RESPONSES_WITH_HEADERS: usize = 23; + pub(crate) static ID_RFC7807: usize = 24; + pub(crate) static ID_UNTYPED_PROPERTY: usize = 25; + pub(crate) static ID_UUID: usize = 26; + pub(crate) static ID_XML: usize = 27; + pub(crate) static ID_XML_EXTRA: usize = 28; + pub(crate) static ID_XML_OTHER: usize = 29; } @@ -1128,6 +1131,89 @@ impl hyper::service::Service<(Request, C)> for Service { + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = form_urlencoded::parse(uri.query().unwrap_or_default().as_bytes()).collect::>(); + let param_required_no_example = query_params.iter().filter(|e| e.0 == "required_no_example").map(|e| e.1.clone()) + .next(); + let param_required_no_example = match param_required_no_example { + Some(param_required_no_example) => { + let param_required_no_example = + ::from_str + (¶m_required_no_example); + match param_required_no_example { + Ok(param_required_no_example) => Some(param_required_no_example), + Err(e) => return Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(body_from_string(format!("Couldn't parse query parameter required_no_example - doesn't match schema: {e}"))) + .expect("Unable to create Bad Request response for invalid query parameter required_no_example")), + } + }, + None => None, + }; + let param_required_no_example = match param_required_no_example { + Some(param_required_no_example) => param_required_no_example, + None => return Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(body_from_str("Missing required query parameter required_no_example")) + .expect("Unable to create Bad Request response for missing query parameter required_no_example")), + }; + let param_required_with_example = query_params.iter().filter(|e| e.0 == "required_with_example").map(|e| e.1.clone()) + .next(); + let param_required_with_example = match param_required_with_example { + Some(param_required_with_example) => { + let param_required_with_example = + ::from_str + (¶m_required_with_example); + match param_required_with_example { + Ok(param_required_with_example) => Some(param_required_with_example), + Err(e) => return Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(body_from_string(format!("Couldn't parse query parameter required_with_example - doesn't match schema: {e}"))) + .expect("Unable to create Bad Request response for invalid query parameter required_with_example")), + } + }, + None => None, + }; + let param_required_with_example = match param_required_with_example { + Some(param_required_with_example) => param_required_with_example, + None => return Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(body_from_str("Missing required query parameter required_with_example")) + .expect("Unable to create Bad Request response for missing query parameter required_with_example")), + }; + + let result = api_impl.query_example_get( + param_required_no_example, + param_required_with_example, + &context + ).await; + let mut response = Response::new(BoxBody::new(http_body_util::Empty::new())); + response.headers_mut().insert( + HeaderName::from_static("x-span-id"), + HeaderValue::from_str((&context as &dyn Has).get().0.clone().as_str()) + .expect("Unable to create X-Span-ID header value")); + + match result { + Ok(rsp) => match rsp { + QueryExampleGetResponse::OK + => { + *response.status_mut() = StatusCode::from_u16(200).expect("Unable to turn 200 into a StatusCode"); + + }, + }, + Err(_) => { + // Application code returned an error. This should not happen, as the implementation should + // return a valid response. + *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; + *response.body_mut() = body_from_str("An internal error occurred"); + }, + } + + Ok(response) + }, + // ReadonlyAuthSchemeGet - GET /readonly_auth_scheme hyper::Method::GET if path.matched(paths::ID_READONLY_AUTH_SCHEME) => { { @@ -2301,6 +2387,7 @@ impl hyper::service::Service<(Request, C)> for Service method_not_allowed(), _ if path.matched(paths::ID_OVERRIDE_SERVER) => method_not_allowed(), _ if path.matched(paths::ID_PARAMGET) => method_not_allowed(), + _ if path.matched(paths::ID_QUERY_EXAMPLE) => method_not_allowed(), _ if path.matched(paths::ID_READONLY_AUTH_SCHEME) => method_not_allowed(), _ if path.matched(paths::ID_REGISTER_CALLBACK) => method_not_allowed(), _ if path.matched(paths::ID_REPOS) => method_not_allowed(), @@ -2360,6 +2447,8 @@ impl RequestParser for ApiRequestParser { hyper::Method::GET if path.matched(paths::ID_OVERRIDE_SERVER) => Some("OverrideServerGet"), // ParamgetGet - GET /paramget hyper::Method::GET if path.matched(paths::ID_PARAMGET) => Some("ParamgetGet"), + // QueryExampleGet - GET /query-example + hyper::Method::GET if path.matched(paths::ID_QUERY_EXAMPLE) => Some("QueryExampleGet"), // ReadonlyAuthSchemeGet - GET /readonly_auth_scheme hyper::Method::GET if path.matched(paths::ID_READONLY_AUTH_SCHEME) => Some("ReadonlyAuthSchemeGet"), // RegisterCallbackPost - POST /register-callback diff --git a/samples/server/petstore/rust-server/output/ops-v3/examples/client/main.rs b/samples/server/petstore/rust-server/output/ops-v3/examples/client/main.rs index e9c51dfbcad6..6a5096b74b0a 100644 --- a/samples/server/petstore/rust-server/output/ops-v3/examples/client/main.rs +++ b/samples/server/petstore/rust-server/output/ops-v3/examples/client/main.rs @@ -69,7 +69,7 @@ fn main() { let matches = Command::new("client") .arg(Arg::new("operation") .help("Sets the operation to run") - .value_parser([ + .value_parser(Vec::<&str>::from([ "Op10Get", "Op11Get", "Op12Get", @@ -107,7 +107,7 @@ fn main() { "Op7Get", "Op8Get", "Op9Get", - ]) + ])) .required(true) .index(1)) .arg(Arg::new("https") diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/README.md b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/README.md index b885c7942938..666027f88b11 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/README.md +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/README.md @@ -95,7 +95,6 @@ cargo run --example petstore-with-fake-endpoints-models-for-testing-client FakeR cargo run --example petstore-with-fake-endpoints-models-for-testing-client TestEndpointParameters cargo run --example petstore-with-fake-endpoints-models-for-testing-client TestEnumParameters cargo run --example petstore-with-fake-endpoints-models-for-testing-client TestJsonFormData -cargo run --example petstore-with-fake-endpoints-models-for-testing-client HyphenParam cargo run --example petstore-with-fake-endpoints-models-for-testing-client FindPetsByStatus cargo run --example petstore-with-fake-endpoints-models-for-testing-client FindPetsByTags cargo run --example petstore-with-fake-endpoints-models-for-testing-client DeletePet @@ -103,14 +102,10 @@ cargo run --example petstore-with-fake-endpoints-models-for-testing-client GetPe cargo run --example petstore-with-fake-endpoints-models-for-testing-client UpdatePetWithForm cargo run --example petstore-with-fake-endpoints-models-for-testing-client UploadFile cargo run --example petstore-with-fake-endpoints-models-for-testing-client GetInventory -cargo run --example petstore-with-fake-endpoints-models-for-testing-client DeleteOrder cargo run --example petstore-with-fake-endpoints-models-for-testing-client GetOrderById cargo run --example petstore-with-fake-endpoints-models-for-testing-client CreateUsersWithArrayInput cargo run --example petstore-with-fake-endpoints-models-for-testing-client CreateUsersWithListInput -cargo run --example petstore-with-fake-endpoints-models-for-testing-client LoginUser cargo run --example petstore-with-fake-endpoints-models-for-testing-client LogoutUser -cargo run --example petstore-with-fake-endpoints-models-for-testing-client DeleteUser -cargo run --example petstore-with-fake-endpoints-models-for-testing-client GetUserByName ``` ### HTTPS diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/examples/client/main.rs b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/examples/client/main.rs index df4b9e3db338..41ce2cfaee50 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/examples/client/main.rs +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/examples/client/main.rs @@ -67,43 +67,28 @@ fn main() { let matches = Command::new("client") .arg(Arg::new("operation") .help("Sets the operation to run") - .value_parser([ - "TestSpecialTags", + .value_parser(Vec::<&str>::from([ "Call123example", "FakeOuterBooleanSerialize", "FakeOuterCompositeSerialize", "FakeOuterNumberSerialize", "FakeOuterStringSerialize", "FakeResponseWithNumericalDescription", - "TestBodyWithQueryParams", - "TestClientModel", "TestEndpointParameters", "TestEnumParameters", - "TestInlineAdditionalProperties", "TestJsonFormData", - "HyphenParam", - "TestClassname", - "AddPet", "FindPetsByStatus", "FindPetsByTags", - "UpdatePet", "DeletePet", "GetPetById", "UpdatePetWithForm", "UploadFile", "GetInventory", - "PlaceOrder", - "DeleteOrder", "GetOrderById", - "CreateUser", "CreateUsersWithArrayInput", "CreateUsersWithListInput", - "LoginUser", "LogoutUser", - "DeleteUser", - "GetUserByName", - "UpdateUser", - ]) + ])) .required(true) .index(1)) .arg(Arg::new("https") @@ -233,7 +218,7 @@ fn main() { /* Disabled because there's no example. Some("TestBodyWithQueryParams") => { let result = rt.block_on(client.test_body_with_query_params( - "query_example".to_string(), + ???, ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); @@ -293,12 +278,14 @@ fn main() { )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + /* Disabled because there's no example. Some("HyphenParam") => { let result = rt.block_on(client.hyphen_param( - "hyphen_param_example".to_string() + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ /* Disabled because there's no example. Some("TestClassname") => { let result = rt.block_on(client.test_classname( @@ -337,20 +324,20 @@ fn main() { */ Some("DeletePet") => { let result = rt.block_on(client.delete_pet( - 789, - Some("api_key_example".to_string()) + 0, + None )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, Some("GetPetById") => { let result = rt.block_on(client.get_pet_by_id( - 789 + 0 )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, Some("UpdatePetWithForm") => { let result = rt.block_on(client.update_pet_with_form( - 789, + 0, Some("name_example".to_string()), Some("status_example".to_string()) )); @@ -358,7 +345,7 @@ fn main() { }, Some("UploadFile") => { let result = rt.block_on(client.upload_file( - 789, + 0, Some("additional_metadata_example".to_string()), Some(swagger::ByteArray(Vec::from("BINARY_DATA_HERE"))) )); @@ -377,15 +364,17 @@ fn main() { info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, */ + /* Disabled because there's no example. Some("DeleteOrder") => { let result = rt.block_on(client.delete_order( - "order_id_example".to_string() + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ Some("GetOrderById") => { let result = rt.block_on(client.get_order_by_id( - 789 + 0 )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, @@ -409,34 +398,40 @@ fn main() { )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + /* Disabled because there's no example. Some("LoginUser") => { let result = rt.block_on(client.login_user( - "username_example".to_string(), - "password_example".to_string() + ???, + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ Some("LogoutUser") => { let result = rt.block_on(client.logout_user( )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + /* Disabled because there's no example. Some("DeleteUser") => { let result = rt.block_on(client.delete_user( - "username_example".to_string() + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ + /* Disabled because there's no example. Some("GetUserByName") => { let result = rt.block_on(client.get_user_by_name( - "username_example".to_string() + ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); }, + */ /* Disabled because there's no example. Some("UpdateUser") => { let result = rt.block_on(client.update_user( - "username_example".to_string(), + ???, ??? )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &dyn Has).get().clone()); diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/models.rs b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/models.rs index aeeb689feb7f..c724b2becd44 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/models.rs +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/models.rs @@ -23,6 +23,26 @@ pub struct AdditionalPropertiesClass { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for AdditionalPropertiesClass { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for AdditionalPropertiesClass { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl AdditionalPropertiesClass { #[allow(clippy::new_without_default)] @@ -197,6 +217,26 @@ pub struct Animal { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Animal { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Animal { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Animal { #[allow(clippy::new_without_default)] @@ -563,6 +603,26 @@ pub struct ApiResponse { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ApiResponse { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ApiResponse { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ApiResponse { #[allow(clippy::new_without_default)] @@ -756,6 +816,26 @@ pub struct ArrayOfArrayOfNumberOnly { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ArrayOfArrayOfNumberOnly { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ArrayOfArrayOfNumberOnly { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ArrayOfArrayOfNumberOnly { #[allow(clippy::new_without_default)] @@ -921,6 +1001,26 @@ pub struct ArrayOfNumberOnly { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ArrayOfNumberOnly { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ArrayOfNumberOnly { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ArrayOfNumberOnly { #[allow(clippy::new_without_default)] @@ -1108,6 +1208,26 @@ pub struct ArrayTest { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ArrayTest { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ArrayTest { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ArrayTest { #[allow(clippy::new_without_default)] @@ -1319,6 +1439,26 @@ pub struct Capitalization { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Capitalization { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Capitalization { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Capitalization { #[allow(clippy::new_without_default)] @@ -1554,6 +1694,26 @@ pub struct Cat { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Cat { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Cat { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Cat { #[allow(clippy::new_without_default)] @@ -1749,6 +1909,26 @@ pub struct Category { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Category { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Category { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Category { #[allow(clippy::new_without_default)] @@ -1932,6 +2112,26 @@ pub struct ClassModel { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ClassModel { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ClassModel { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ClassModel { #[allow(clippy::new_without_default)] @@ -2103,6 +2303,26 @@ pub struct Client { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Client { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Client { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Client { #[allow(clippy::new_without_default)] @@ -2283,6 +2503,26 @@ pub struct Dog { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Dog { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Dog { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Dog { #[allow(clippy::new_without_default)] @@ -2473,6 +2713,26 @@ pub struct DollarSpecialLeftSquareBracketModelNameRightSquareBracket { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for DollarSpecialLeftSquareBracketModelNameRightSquareBracket { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for DollarSpecialLeftSquareBracketModelNameRightSquareBracket { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl DollarSpecialLeftSquareBracketModelNameRightSquareBracket { #[allow(clippy::new_without_default)] @@ -2657,6 +2917,26 @@ pub struct EnumArrays { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for EnumArrays { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for EnumArrays { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl EnumArrays { #[allow(clippy::new_without_default)] @@ -3353,6 +3633,26 @@ pub struct EnumTest { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for EnumTest { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for EnumTest { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl EnumTest { #[allow(clippy::new_without_default)] @@ -4008,6 +4308,26 @@ pub struct FormatTest { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for FormatTest { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for FormatTest { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + lazy_static::lazy_static! { static ref RE_FORMATTEST_STRING: regex::Regex = regex::Regex::new(r"/[a-z]/i").unwrap(); } @@ -4296,6 +4616,26 @@ pub struct HasOnlyReadOnly { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for HasOnlyReadOnly { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for HasOnlyReadOnly { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl HasOnlyReadOnly { #[allow(clippy::new_without_default)] @@ -4478,6 +4818,26 @@ pub struct List { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for List { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for List { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl List { #[allow(clippy::new_without_default)] @@ -4661,6 +5021,26 @@ pub struct MapTest { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for MapTest { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for MapTest { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl MapTest { #[allow(clippy::new_without_default)] @@ -4970,6 +5350,26 @@ pub struct MixedPropertiesAndAdditionalPropertiesClass { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for MixedPropertiesAndAdditionalPropertiesClass { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for MixedPropertiesAndAdditionalPropertiesClass { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl MixedPropertiesAndAdditionalPropertiesClass { #[allow(clippy::new_without_default)] @@ -5154,6 +5554,26 @@ pub struct Model200Response { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Model200Response { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Model200Response { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Model200Response { #[allow(clippy::new_without_default)] @@ -5352,6 +5772,26 @@ pub struct Name { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Name { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Name { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Name { #[allow(clippy::new_without_default)] @@ -5552,6 +5992,26 @@ pub struct NumberOnly { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for NumberOnly { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for NumberOnly { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl NumberOnly { #[allow(clippy::new_without_default)] @@ -5724,6 +6184,26 @@ pub struct ObjectContainingObjectWithOnlyAdditionalProperties { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ObjectContainingObjectWithOnlyAdditionalProperties { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ObjectContainingObjectWithOnlyAdditionalProperties { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ObjectContainingObjectWithOnlyAdditionalProperties { #[allow(clippy::new_without_default)] @@ -5921,6 +6401,16 @@ impl serde_valid::validation::ValidateCompositedMinLength for ObjectWithOnlyAddi Ok(()) } } + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ObjectWithOnlyAdditionalProperties { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} /// Converts the ObjectWithOnlyAdditionalProperties value to the Query Parameters representation (style=form, explode=false) /// specified in /// Should be implemented in a serde serializer @@ -6066,6 +6556,26 @@ pub struct Order { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Order { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Order { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Order { #[allow(clippy::new_without_default)] @@ -6441,6 +6951,16 @@ impl serde_valid::validation::ValidateCompositedMinLength for OuterBoolean { Ok(()) } } + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for OuterBoolean { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} /// Converts the OuterBoolean value to the Query Parameters representation (style=form, explode=false) /// specified in /// Should be implemented in a serde serializer @@ -6571,6 +7091,26 @@ pub struct OuterComposite { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for OuterComposite { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for OuterComposite { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl OuterComposite { #[allow(clippy::new_without_default)] @@ -6922,6 +7462,16 @@ impl serde_valid::validation::ValidateCompositedMinLength for OuterNumber { Ok(()) } } + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for OuterNumber { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} /// Converts the OuterNumber value to the Query Parameters representation (style=form, explode=false) /// specified in /// Should be implemented in a serde serializer @@ -7073,6 +7623,16 @@ impl serde_valid::validation::ValidateCompositedMinLength for OuterString { Ok(()) } } + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for OuterString { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} impl std::fmt::Display for OuterString { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0.clone()) @@ -7210,6 +7770,26 @@ pub struct Pet { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Pet { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Pet { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Pet { #[allow(clippy::new_without_default)] @@ -7544,6 +8124,26 @@ pub struct ReadOnlyFirst { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ReadOnlyFirst { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ReadOnlyFirst { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ReadOnlyFirst { #[allow(clippy::new_without_default)] @@ -7728,6 +8328,26 @@ pub struct Return { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Return { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Return { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Return { #[allow(clippy::new_without_default)] @@ -7905,6 +8525,26 @@ pub struct Tag { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for Tag { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for Tag { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl Tag { #[allow(clippy::new_without_default)] @@ -8743,6 +9383,26 @@ pub struct User { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for User { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for User { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl User { #[allow(clippy::new_without_default)] diff --git a/samples/server/petstore/rust-server/output/ping-bearer-auth/examples/client/main.rs b/samples/server/petstore/rust-server/output/ping-bearer-auth/examples/client/main.rs index c7ff5d2f012e..38d66b01a81c 100644 --- a/samples/server/petstore/rust-server/output/ping-bearer-auth/examples/client/main.rs +++ b/samples/server/petstore/rust-server/output/ping-bearer-auth/examples/client/main.rs @@ -33,9 +33,9 @@ fn main() { let matches = Command::new("client") .arg(Arg::new("operation") .help("Sets the operation to run") - .value_parser([ + .value_parser(Vec::<&str>::from([ "PingGet", - ]) + ])) .required(true) .index(1)) .arg(Arg::new("https") diff --git a/samples/server/petstore/rust-server/output/rust-server-test/examples/client/main.rs b/samples/server/petstore/rust-server/output/rust-server-test/examples/client/main.rs index 87e4794a994d..bf307b4ffaba 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/examples/client/main.rs +++ b/samples/server/petstore/rust-server/output/rust-server-test/examples/client/main.rs @@ -41,17 +41,15 @@ fn main() { let matches = Command::new("client") .arg(Arg::new("operation") .help("Sets the operation to run") - .value_parser([ + .value_parser(Vec::<&str>::from([ "AllOfGet", "DummyGet", - "DummyPut", "FileResponseGet", "GetStructuredYaml", "HtmlPost", "PostYaml", "RawJsonGet", - "SoloObjectPost", - ]) + ])) .required(true) .index(1)) .arg(Arg::new("https") diff --git a/samples/server/petstore/rust-server/output/rust-server-test/src/models.rs b/samples/server/petstore/rust-server/output/rust-server-test/src/models.rs index cfd9f492b576..34b68a00e668 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/src/models.rs +++ b/samples/server/petstore/rust-server/output/rust-server-test/src/models.rs @@ -24,6 +24,26 @@ pub struct ANullableContainer { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ANullableContainer { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ANullableContainer { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ANullableContainer { #[allow(clippy::new_without_default)] @@ -223,6 +243,16 @@ impl serde_valid::validation::ValidateCompositedMinLength for AdditionalProperti Ok(()) } } + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for AdditionalPropertiesObject { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} /// Converts the AdditionalPropertiesObject value to the Query Parameters representation (style=form, explode=false) /// specified in /// Should be implemented in a serde serializer @@ -337,6 +367,26 @@ pub struct AllOfObject { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for AllOfObject { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for AllOfObject { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl AllOfObject { #[allow(clippy::new_without_default)] @@ -510,6 +560,26 @@ pub struct BaseAllOf { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for BaseAllOf { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for BaseAllOf { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl BaseAllOf { #[allow(clippy::new_without_default)] @@ -676,6 +746,26 @@ pub struct DummyPutRequest { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for DummyPutRequest { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for DummyPutRequest { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl DummyPutRequest { #[allow(clippy::new_without_default)] @@ -847,6 +937,26 @@ pub struct GetYamlResponse { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for GetYamlResponse { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for GetYamlResponse { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl GetYamlResponse { #[allow(clippy::new_without_default)] @@ -1011,6 +1121,26 @@ pub struct ObjectOfObjects { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ObjectOfObjects { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ObjectOfObjects { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ObjectOfObjects { #[allow(clippy::new_without_default)] @@ -1172,6 +1302,26 @@ pub struct ObjectOfObjectsInner { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for ObjectOfObjectsInner { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for ObjectOfObjectsInner { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl ObjectOfObjectsInner { #[allow(clippy::new_without_default)] @@ -1347,6 +1497,26 @@ pub struct UnnamedAllofUnderProperties { } +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMinLength for UnnamedAllofUnderProperties { + fn validate_composited_min_length( + &self, + _min_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for UnnamedAllofUnderProperties { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} + impl UnnamedAllofUnderProperties { #[allow(clippy::new_without_default)] @@ -1542,6 +1712,16 @@ impl serde_valid::validation::ValidateCompositedMinLength for UnnamedReference { Ok(()) } } + +#[cfg(feature = "validate")] +impl serde_valid::validation::ValidateCompositedMaxLength for UnnamedReference { + fn validate_composited_max_length( + &self, + _max_length: usize, + ) -> Result<(), serde_valid::validation::Composited> { + Ok(()) + } +} /// Converts the UnnamedReference value to the Query Parameters representation (style=form, explode=false) /// specified in /// Should be implemented in a serde serializer