diff --git a/crates/serde_valid/src/error.rs b/crates/serde_valid/src/error.rs index 92cae6cd..bc5ca928 100644 --- a/crates/serde_valid/src/error.rs +++ b/crates/serde_valid/src/error.rs @@ -51,13 +51,13 @@ where macro_rules! struct_error_params { ( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message=$default_message:literal] pub struct $Error:ident { pub $limit:ident: Vec<$type:ty>, } ) => { - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] pub struct $Error { pub $limit: Vec<$type>, } @@ -85,13 +85,13 @@ macro_rules! struct_error_params { }; ( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message=$default_message:literal] pub struct $Error:ident { pub $limit:ident: $type:ty, } ) => { - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] pub struct $Error { pub $limit: $type, } @@ -113,11 +113,11 @@ macro_rules! struct_error_params { }; ( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message=$default_message:literal] pub struct $Error:ident; ) => { - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] pub struct $Error; impl FormatDefault for $Error { @@ -131,7 +131,7 @@ macro_rules! struct_error_params { // Number struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The number must be `>= {}`."] pub struct MinimumError { pub minimum: Number, @@ -139,7 +139,7 @@ struct_error_params!( ); struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The number must be `<= {}`."] pub struct MaximumError { pub maximum: Number, @@ -147,7 +147,7 @@ struct_error_params!( ); struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The number must be `> {}`."] pub struct ExclusiveMinimumError { pub exclusive_minimum: Number, @@ -155,7 +155,7 @@ struct_error_params!( ); struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The number must be `< {}`."] pub struct ExclusiveMaximumError { pub exclusive_maximum: Number, @@ -163,7 +163,7 @@ struct_error_params!( ); struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The value must be multiple of `{}`."] pub struct MultipleOfError { pub multiple_of: Number, @@ -172,7 +172,7 @@ struct_error_params!( // String struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The length of the value must be `>= {}`."] pub struct MinLengthError { pub min_length: usize, @@ -180,7 +180,7 @@ struct_error_params!( ); struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The length of the value must be `<= {}`."] pub struct MaxLengthError { pub max_length: usize, @@ -188,7 +188,7 @@ struct_error_params!( ); struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The value must match the pattern of \"{0}\"."] pub struct PatternError { pub pattern: String, @@ -197,7 +197,7 @@ struct_error_params!( // Array struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The length of the items must be `<= {}`."] pub struct MaxItemsError { pub max_items: usize, @@ -205,7 +205,7 @@ struct_error_params!( ); struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The length of the items must be `>= {}`."] pub struct MinItemsError { pub min_items: usize, @@ -213,14 +213,14 @@ struct_error_params!( ); struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The items must be unique."] pub struct UniqueItemsError; ); // Object struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The size of the properties must be `<= {}`."] pub struct MaxPropertiesError { pub max_properties: usize, @@ -228,7 +228,7 @@ struct_error_params!( ); struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The size of the properties must be `>= {}`."] pub struct MinPropertiesError { pub min_properties: usize, @@ -237,7 +237,7 @@ struct_error_params!( // Generic struct_error_params!( - #[derive(Debug, Clone)] + #[derive(Debug, Clone, PartialEq)] #[default_message = "The value must be in [{:}]."] pub struct EnumError { pub candidates: Vec, diff --git a/crates/serde_valid/src/features/fluent/message.rs b/crates/serde_valid/src/features/fluent/message.rs index d3f4ce31..3f944907 100644 --- a/crates/serde_valid/src/features/fluent/message.rs +++ b/crates/serde_valid/src/features/fluent/message.rs @@ -1,4 +1,4 @@ -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct Message { pub id: &'static str, pub args: Vec<(&'static str, fluent::FluentValue<'static>)>, diff --git a/crates/serde_valid/src/validation/error.rs b/crates/serde_valid/src/validation/error.rs index 30b0df5f..9c6ef34a 100644 --- a/crates/serde_valid/src/validation/error.rs +++ b/crates/serde_valid/src/validation/error.rs @@ -20,7 +20,7 @@ pub use into_error::IntoError; pub use message::Message; pub use object_errors::ObjectErrors; -#[derive(Debug, Clone, serde::Serialize, thiserror::Error)] +#[derive(Debug, Clone, PartialEq, serde::Serialize, thiserror::Error)] #[serde(untagged)] pub enum Error { #[error("{0}")] diff --git a/crates/serde_valid/src/validation/error/array_erros.rs b/crates/serde_valid/src/validation/error/array_erros.rs index 4e7e05f8..7c214a55 100644 --- a/crates/serde_valid/src/validation/error/array_erros.rs +++ b/crates/serde_valid/src/validation/error/array_erros.rs @@ -2,7 +2,7 @@ use serde::ser::SerializeStruct; use super::{ItemErrorsMap, VecErrors}; -#[derive(Debug, Clone, thiserror::Error)] +#[derive(Debug, Clone, PartialEq, thiserror::Error)] pub struct ArrayErrors { pub errors: VecErrors, pub items: ItemErrorsMap, diff --git a/crates/serde_valid/src/validation/error/errors.rs b/crates/serde_valid/src/validation/error/errors.rs index 1713799e..84d85eda 100644 --- a/crates/serde_valid/src/validation/error/errors.rs +++ b/crates/serde_valid/src/validation/error/errors.rs @@ -1,6 +1,6 @@ use super::{ArrayErrors, ObjectErrors, VecErrors}; -#[derive(Debug, Clone, thiserror::Error)] +#[derive(Debug, Clone, PartialEq, thiserror::Error)] pub enum Errors { Array(ArrayErrors), Object(ObjectErrors), diff --git a/crates/serde_valid/src/validation/error/format.rs b/crates/serde_valid/src/validation/error/format.rs index b9dad41f..757ea739 100644 --- a/crates/serde_valid/src/validation/error/format.rs +++ b/crates/serde_valid/src/validation/error/format.rs @@ -20,6 +20,21 @@ impl Clone for Format { } } +/// `MessageFn` is compared by function address, so two identical functions +/// are not guaranteed to compare equal. +impl PartialEq for Format { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Self::Default, Self::Default) => true, + (Self::Message(a), Self::Message(b)) => a == b, + (Self::MessageFn(a), Self::MessageFn(b)) => std::ptr::fn_addr_eq(*a, *b), + #[cfg(feature = "fluent")] + (Self::Fluent(a), Self::Fluent(b)) => a == b, + _ => false, + } + } +} + impl Format { pub fn into_message(self, error: E) -> crate::validation::error::Message { crate::validation::error::Message::new(error, self) diff --git a/crates/serde_valid/src/validation/error/message.rs b/crates/serde_valid/src/validation/error/message.rs index 6df1abf5..be542e41 100644 --- a/crates/serde_valid/src/validation/error/message.rs +++ b/crates/serde_valid/src/validation/error/message.rs @@ -1,6 +1,6 @@ use super::{Format, FormatDefault}; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct Message { error: E, format: Format, diff --git a/crates/serde_valid/src/validation/error/object_errors.rs b/crates/serde_valid/src/validation/error/object_errors.rs index af1ff32a..a8c9462c 100644 --- a/crates/serde_valid/src/validation/error/object_errors.rs +++ b/crates/serde_valid/src/validation/error/object_errors.rs @@ -2,7 +2,7 @@ use serde::ser::SerializeStruct; use super::{PropertyErrorsMap, VecErrors}; -#[derive(Debug, Clone, thiserror::Error)] +#[derive(Debug, Clone, PartialEq, thiserror::Error)] pub struct ObjectErrors { pub errors: VecErrors, pub properties: PropertyErrorsMap,