diff --git a/core/Cargo.toml b/core/Cargo.toml index a456d3bf2..3a607f085 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -38,7 +38,6 @@ actix-web-validator3 = { version = "3.0", optional = true, package = "actix-web- validator12 = { version = "0.12", features = ["derive"], optional = true, package = "validator" } validator14 = { version = "0.14", features = ["derive"], optional = true, package = "validator" } openapiv3 = { version = "1.0.3", optional = true } -indexmap = { version = "2.0", features = ["serde"], optional = true } [features] # actix-web support @@ -54,7 +53,7 @@ nightly = ["paperclip-macros/nightly"] # OpenAPI support (v2 and codegen) v2 = ["paperclip-macros/v2"] -v3 = ["v2", "openapiv3", "indexmap"] +v3 = ["v2", "openapiv3"] codegen = ["v2", "heck", "log"] uuid = ["uuid0"] uuid0 = ["uuid0_dep"] diff --git a/core/src/lib.rs b/core/src/lib.rs index ea7851d0f..80a317bcd 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -15,7 +15,7 @@ pub mod im; pub mod util; #[cfg(feature = "v2")] pub mod v2; -#[cfg(feature = "v3")] +// #[cfg(feature = "v3")] pub mod v3; pub use self::error::ValidationError; diff --git a/core/src/v2/models.rs b/core/src/v2/models.rs index a686c0e1e..66055fb7d 100644 --- a/core/src/v2/models.rs +++ b/core/src/v2/models.rs @@ -84,6 +84,7 @@ pub enum DataTypeFormat { Other, } +#[allow(clippy::to_string_trait_impl)] impl ToString for DataTypeFormat { fn to_string(&self) -> String { match self { @@ -439,7 +440,7 @@ pub struct PathItem { impl PathItem, Response> { /// Normalizes this operation map. /// - Collects and removes parameters shared across operations - /// and adds them to the list global to this map. + /// and adds them to the list global to this map. pub fn normalize(&mut self) { // We're using `Option` over `BTreeSet` because we need to // differentiate between the first operation that we use for initial diff --git a/core/src/v2/schema.rs b/core/src/v2/schema.rs index 0baa2ae76..2f945e7fb 100644 --- a/core/src/v2/schema.rs +++ b/core/src/v2/schema.rs @@ -257,11 +257,11 @@ impl_type_simple!(std::net::Ipv6Addr, DataType::String, DataTypeFormat::IpV6); /// framework-specific macros: /// /// - [`Apiv2Schema`](https://paperclip-rs.github.io/paperclip/paperclip_actix/derive.Apiv2Schema.html) -/// for schema objects. +/// for schema objects. /// - [`Apiv2Security`](https://paperclip-rs.github.io/paperclip/paperclip_actix/derive.Apiv2Security.html) -/// for security scheme objects. +/// for security scheme objects. /// - [`Apiv2Header`](https://paperclip-rs.github.io/paperclip/paperclip_actix/derive.Apiv2Header.html) -/// for header parameters objects. +/// for header parameters objects. /// /// This is implemented for primitive types by default. pub trait Apiv2Schema { diff --git a/core/src/v3/contact.rs b/core/src/v3/contact.rs index 603628cd5..911bbfd48 100644 --- a/core/src/v3/contact.rs +++ b/core/src/v3/contact.rs @@ -6,7 +6,7 @@ impl From for openapiv3::Contact { name: v2.name, url: v2.url, email: v2.email, - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), } } } diff --git a/core/src/v3/external_documentation.rs b/core/src/v3/external_documentation.rs index 5e2262a31..1e6923a1d 100644 --- a/core/src/v3/external_documentation.rs +++ b/core/src/v3/external_documentation.rs @@ -5,7 +5,7 @@ impl From for openapiv3::ExternalDocumentation { openapiv3::ExternalDocumentation { description: v2.description, url: v2.url, - extensions: indexmap::IndexMap::new(), + extensions: Self::default().extensions, } } } diff --git a/core/src/v3/header.rs b/core/src/v3/header.rs index f3a21abcf..99ab77e94 100644 --- a/core/src/v3/header.rs +++ b/core/src/v3/header.rs @@ -7,10 +7,10 @@ impl From for openapiv3::Header { style: Default::default(), required: false, deprecated: None, - format: openapiv3::ParameterSchemaOrContent::Content(indexmap::IndexMap::new()), + format: openapiv3::ParameterSchemaOrContent::Content(Default::default()), example: None, - extensions: indexmap::IndexMap::new(), - examples: indexmap::IndexMap::new(), + extensions: Default::default(), + examples: Default::default(), } } } diff --git a/core/src/v3/info.rs b/core/src/v3/info.rs index 790824e47..1afb64700 100644 --- a/core/src/v3/info.rs +++ b/core/src/v3/info.rs @@ -9,13 +9,13 @@ impl From for openapiv3::Info { contact: v2.contact.map(|c| c.into()), license: v2.license.map(From::from), version: v2.version, - extensions: v2.extensions.into_iter().fold( - indexmap::IndexMap::new(), - |mut i, (k, v)| { + extensions: v2 + .extensions + .into_iter() + .fold(Default::default(), |mut i, (k, v)| { i.insert(k, v); i - }, - ), + }), } } } diff --git a/core/src/v3/license.rs b/core/src/v3/license.rs index 9b18e051c..c1937829d 100644 --- a/core/src/v3/license.rs +++ b/core/src/v3/license.rs @@ -5,7 +5,7 @@ impl From for openapiv3::License { openapiv3::License { name: v2.name.unwrap_or_default(), url: v2.url, - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), } } } diff --git a/core/src/v3/openapi.rs b/core/src/v3/openapi.rs index 6f051e6ad..ce9e1fd6c 100644 --- a/core/src/v3/openapi.rs +++ b/core/src/v3/openapi.rs @@ -17,22 +17,19 @@ impl From for openapiv3::OpenAPI { .security_schemes .insert(name, openapiv3::ReferenceOr::Item(scheme.into())); } - components.responses = v2 - .responses - .iter() - .fold(indexmap::IndexMap::new(), |mut i, b| { - i.insert(b.0.to_string(), b.1.clone().into()); + components.responses = v2.responses.iter().fold(Default::default(), |mut i, b| { + i.insert(b.0.to_string(), b.1.clone().into()); + i + }); + spec.extensions = v2 + .extensions + .into_iter() + .fold(Default::default(), |mut i, (k, v)| { + i.insert(k, v); i }); - spec.extensions = - v2.extensions - .into_iter() - .fold(indexmap::IndexMap::new(), |mut i, (k, v)| { - i.insert(k, v); - i - }); spec.paths = openapiv3::Paths { - paths: v2.paths.iter().fold(indexmap::IndexMap::new(), |mut i, b| { + paths: v2.paths.iter().fold(Default::default(), |mut i, b| { i.insert( b.0.to_string(), openapiv3::ReferenceOr::Item(b.1.clone().into()), @@ -42,13 +39,10 @@ impl From for openapiv3::OpenAPI { ..Default::default() }; - components.schemas = v2 - .definitions - .iter() - .fold(indexmap::IndexMap::new(), |mut i, b| { - i.insert(b.0.to_string(), b.1.clone().into()); - i - }); + components.schemas = v2.definitions.iter().fold(Default::default(), |mut i, b| { + i.insert(b.0.to_string(), b.1.clone().into()); + i + }); spec.components = Some(components); spec @@ -77,7 +71,7 @@ fn openapi3_servers( url: format!("{}://{}{}", scheme_str, host, base.as_deref().unwrap_or("")), description: None, variables: None, - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), } }) .collect() @@ -86,7 +80,7 @@ fn openapi3_servers( url: format!("//{}{}", host, base.as_deref().unwrap_or("")), description: None, variables: None, - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), }] } } else { @@ -94,7 +88,7 @@ fn openapi3_servers( url: base.unwrap_or_else(|| "/".to_string()), description: None, variables: None, - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), }] } } diff --git a/core/src/v3/operation.rs b/core/src/v3/operation.rs index a7498634a..3f7c1bc38 100644 --- a/core/src/v3/operation.rs +++ b/core/src/v3/operation.rs @@ -85,10 +85,9 @@ impl From> for op request_body, responses: openapiv3::Responses { default: None, - responses: v2 - .responses - .iter() - .fold(indexmap::IndexMap::new(), |mut i, (k, v)| { + responses: v2.responses.iter().fold( + openapiv3::Responses::default().responses, + |mut i, (k, v)| { if let Ok(code) = k.parse::() { let code = openapiv3::StatusCode::Code(code); i.insert( @@ -101,7 +100,8 @@ impl From> for op ); } i - }), + }, + ), ..Default::default() }, deprecated: v2.deprecated, @@ -112,16 +112,19 @@ impl From> for op v2.security .iter() .map(|s| { - s.iter().fold(indexmap::IndexMap::new(), |mut i, (k, v)| { - i.insert(k.to_string(), v.clone()); - i - }) + s.iter().fold( + openapiv3::SecurityRequirement::default(), + |mut i, (k, v)| { + i.insert(k.to_string(), v.clone()); + i + }, + ) }) .collect(), ) }, servers: vec![], - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), } } } diff --git a/core/src/v3/paths.rs b/core/src/v3/paths.rs index 5e516b67f..a78073b53 100644 --- a/core/src/v3/paths.rs +++ b/core/src/v3/paths.rs @@ -26,7 +26,7 @@ impl From for openapiv3::PathItem { }) .parameters }, - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), description: None, summary: None, } diff --git a/core/src/v3/request_body.rs b/core/src/v3/request_body.rs index 378155b18..6e355deba 100644 --- a/core/src/v3/request_body.rs +++ b/core/src/v3/request_body.rs @@ -19,9 +19,9 @@ impl From ))), }, example: None, - examples: indexmap::IndexMap::new(), + examples: Default::default(), explode: None, - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), }; match v2.in_ { @@ -49,12 +49,12 @@ impl From schema: v2.schema.map(|s| s.into()), ..Default::default() }; - let mut map = indexmap::IndexMap::new(); + let mut map = openapiv3::RequestBody::default().content; map.insert(v2::SpecFormat::Json.mime().0.to_string(), media); map }, required: v2.required, - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), })), } } diff --git a/core/src/v3/response.rs b/core/src/v3/response.rs index f626bcac7..1ac0a8dba 100644 --- a/core/src/v3/response.rs +++ b/core/src/v3/response.rs @@ -13,7 +13,7 @@ impl From> for openapiv3::Response { .response .headers .iter() - .fold(indexmap::IndexMap::new(), |mut i, b| { + .fold(Default::default(), |mut i, b| { i.insert( b.0.to_string(), openapiv3::ReferenceOr::Item(b.1.clone().into()), @@ -34,7 +34,7 @@ impl From> for openapiv3::Response { ..Default::default() }; - let mut map = indexmap::IndexMap::new(); + let mut map = openapiv3::Response::default().content; match v2.operation.produces.as_ref() { Some(range) => { for mime in range { @@ -52,11 +52,11 @@ impl From> for openapiv3::Response { } map } - None => indexmap::IndexMap::new(), + None => Default::default(), } }, - extensions: indexmap::IndexMap::new(), - links: indexmap::IndexMap::new(), + extensions: Default::default(), + links: Default::default(), } } } @@ -72,13 +72,13 @@ impl From> for openapiv3::ReferenceOr { let response = openapiv3::Response { description: "".to_string(), - headers: indexmap::IndexMap::new(), + headers: Default::default(), content: { let media = openapiv3::MediaType { schema: Some(reference.into()), ..Default::default() }; - let mut map = indexmap::IndexMap::new(); + let mut map = openapiv3::Response::default().content; match v2.operation.produces.as_ref() { Some(range) => { for mime in range { @@ -92,8 +92,8 @@ impl From> for openapiv3::ReferenceOr for openapiv3::ReferenceOr { description: v2.description, discriminator: None, default: None, - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), }, schema_kind: { if let Some(data_type) = v2.data_type { @@ -175,12 +175,10 @@ fn v2_data_type_to_v3( v2::DataType::Object => { openapiv3::SchemaKind::Type(openapiv3::Type::Object(openapiv3::ObjectType { properties: { - properties - .iter() - .fold(indexmap::IndexMap::new(), |mut i, b| { - i.insert(b.0.to_string(), b.1.deref().clone().into()); - i - }) + properties.iter().fold(Default::default(), |mut i, b| { + i.insert(b.0.to_string(), b.1.deref().clone().into()); + i + }) }, required: required.iter().cloned().collect::>(), additional_properties: None, diff --git a/core/src/v3/security_scheme.rs b/core/src/v3/security_scheme.rs index 5a0aa21ad..7f074da90 100644 --- a/core/src/v3/security_scheme.rs +++ b/core/src/v3/security_scheme.rs @@ -1,5 +1,14 @@ use super::v2; +macro_rules! to_indexmap { + ($v2:expr) => { + $v2.scopes.iter().fold(Default::default(), |mut i, (k, v)| { + i.insert(k.to_string(), v.to_string()); + i + }) + }; +} + impl From for openapiv3::SecurityScheme { fn from(v2: v2::SecurityScheme) -> Self { match v2.type_.as_str() { @@ -18,13 +27,6 @@ impl From for openapiv3::SecurityScheme { description: v2.description, }, "oauth2" => { - let scopes = v2 - .scopes - .iter() - .fold(indexmap::IndexMap::new(), |mut i, (k, v)| { - i.insert(k.clone(), v.clone()); - i - }); let flow = v2.flow.unwrap_or_default(); openapiv3::SecurityScheme::OAuth2 { flows: openapiv3::OAuth2Flows { @@ -32,7 +34,7 @@ impl From for openapiv3::SecurityScheme { "implicit" => Some(openapiv3::OAuth2Flow::Implicit { authorization_url: v2.auth_url.clone().unwrap_or_default(), refresh_url: None, - scopes: scopes.clone(), + scopes: to_indexmap!(v2), }), _ => None, }, @@ -40,7 +42,7 @@ impl From for openapiv3::SecurityScheme { "password" => Some(openapiv3::OAuth2Flow::Password { refresh_url: None, token_url: v2.token_url.clone().unwrap_or_default(), - scopes: scopes.clone(), + scopes: to_indexmap!(v2), }), _ => None, }, @@ -48,7 +50,7 @@ impl From for openapiv3::SecurityScheme { "application" => Some(openapiv3::OAuth2Flow::ClientCredentials { refresh_url: None, token_url: v2.token_url.clone().unwrap_or_default(), - scopes: scopes.clone(), + scopes: to_indexmap!(v2), }), _ => None, }, @@ -57,7 +59,7 @@ impl From for openapiv3::SecurityScheme { authorization_url: v2.auth_url.clone().unwrap_or_default(), token_url: v2.token_url.clone().unwrap_or_default(), refresh_url: None, - scopes, + scopes: to_indexmap!(v2), }), _ => None, }, diff --git a/core/src/v3/tag.rs b/core/src/v3/tag.rs index f55d1e44e..810548084 100644 --- a/core/src/v3/tag.rs +++ b/core/src/v3/tag.rs @@ -6,7 +6,7 @@ impl From for openapiv3::Tag { name: v2.name, description: v2.description, external_docs: v2.external_docs.map(openapiv3::ExternalDocumentation::from), - extensions: indexmap::IndexMap::new(), + extensions: Default::default(), } } } diff --git a/src/error.rs b/src/error.rs index 950aae9a3..f1a7c335c 100644 --- a/src/error.rs +++ b/src/error.rs @@ -59,10 +59,6 @@ pub enum PaperClipError { /// YAML coding errors. #[error("YAML error: {}", _0)] Yaml(serde_yaml::Error), - #[cfg(feature = "codegen-fmt")] - /// Errors from rustfmt. - #[error("Rustfmt formatting error: {}", _0)] - RustFmt(rustfmt_nightly::ErrorKind), #[cfg(feature = "codegen")] /// Errors in templating. #[error("Templating error: {}", _0)] @@ -73,7 +69,5 @@ impl_err_from!(PaperClipError::std::io::Error > Io); impl_err_from!(PaperClipError::serde_json::Error > Json); impl_err_from!(PaperClipError::serde_yaml::Error > Yaml); impl_err_from!(PaperClipError::paperclip_core::ValidationError > Validation); -#[cfg(feature = "codegen-fmt")] -impl_err_from!(PaperClipError::rustfmt_nightly::ErrorKind > RustFmt); #[cfg(feature = "codegen")] impl_err_from!(PaperClipError::tinytemplate::error::Error > Templating); diff --git a/src/v2/codegen/impls.rs b/src/v2/codegen/impls.rs index a5f3c556e..4ce40cd34 100644 --- a/src/v2/codegen/impls.rs +++ b/src/v2/codegen/impls.rs @@ -926,7 +926,7 @@ impl<'a, 'b> SendableCodegen<'a, 'b> { /// Handle field for a form data parameter. fn handle_form_param(&mut self, field: StructField) { let name = object::to_snake_case(field.name); - if let Some(CollectionFormat::Multi) = field.delimiting.get(0) { + if let Some(CollectionFormat::Multi) = field.delimiting.first() { let _ = write!( self.form, " @@ -988,7 +988,7 @@ impl<'a, 'b> SendableCodegen<'a, 'b> { /// Handle field for an URL query parameter. fn handle_query_param(&mut self, field: StructField) { let name = object::to_snake_case(field.name); - if let Some(CollectionFormat::Multi) = field.delimiting.get(0) { + if let Some(CollectionFormat::Multi) = field.delimiting.first() { self.multi_value_query.push(format!( " &self.{}param_{}.as_ref().map(|v| {{ diff --git a/src/v2/codegen/object.rs b/src/v2/codegen/object.rs index 3af6ae04e..3ddc7aa35 100644 --- a/src/v2/codegen/object.rs +++ b/src/v2/codegen/object.rs @@ -1005,7 +1005,7 @@ impl ApiObject { // FIXME: Currently, we're implementing the first value as enum default. // If "default" field exists, then we should use that instead. - if let Some(var) = self.variants().get(0) { + if let Some(var) = self.variants().first() { writeln!( f, "impl Default for {name} {{ diff --git a/src/v2/mod.rs b/src/v2/mod.rs index 3105a30bb..22879f60a 100644 --- a/src/v2/mod.rs +++ b/src/v2/mod.rs @@ -60,9 +60,9 @@ //! raw schema. During resolution, we: //! //! - walk through the nodes, find `$ref` fields and assign references to -//! the actual definitions. +//! the actual definitions. //! - identify anonymous definitions in body parameters and response schemas -//! and add them to the known map of definitions. +//! and add them to the known map of definitions. //! //! ```rust,no_run //! #[cfg(feature = "codegen")] {