use std::error::Error as StdError;
use std::fmt;
#[derive(Debug, Clone)]
pub struct FieldError {
pub field: String,
pub message: String,
pub code: Option<String>,
}
impl FieldError {
pub fn new(field: impl Into<String>, message: impl Into<String>) -> Self {
Self {
field: field.into(),
message: message.into(),
code: None,
}
}
pub fn with_code(mut self, code: impl Into<String>) -> Self {
self.code = Some(code.into());
self
}
pub fn field_name(&self) -> &str {
&self.field
}
pub fn message(&self) -> &str {
&self.message
}
pub fn code(&self) -> Option<&str> {
self.code.as_deref()
}
pub fn has_code(&self) -> bool {
self.code.is_some()
}
pub fn set_code(&mut self, code: impl Into<String>) {
self.code = Some(code.into());
}
pub fn clear_code(&mut self) {
self.code = None;
}
pub fn update_message(&mut self, message: impl Into<String>) {
self.message = message.into();
}
pub fn update_field(&mut self, field: impl Into<String>) {
self.field = field.into();
}
pub fn with_field(&self, field: impl Into<String>) -> Self {
Self {
field: field.into(),
message: self.message.clone(),
code: self.code.clone(),
}
}
pub fn with_message(&self, message: impl Into<String>) -> Self {
Self {
field: self.field.clone(),
message: message.into(),
code: self.code.clone(),
}
}
pub fn with_error_code(&self, code: impl Into<String>) -> Self {
Self {
field: self.field.clone(),
message: self.message.clone(),
code: Some(code.into()),
}
}
}
impl fmt::Display for FieldError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}: {}", self.field, self.message)
}
}
impl StdError for FieldError {}
impl PartialEq for FieldError {
fn eq(&self, other: &Self) -> bool {
self.field == other.field && self.message == other.message && self.code == other.code
}
}
impl Eq for FieldError {}