use super::{ErrorContext, FormError};
pub trait ErrorHandler {
fn handle_error(&self, error: &FormError, context: &ErrorContext);
fn should_log_error(&self, error: &FormError) -> bool;
fn should_report_error(&self, error: &FormError) -> bool;
}
pub struct DefaultErrorHandler;
impl ErrorHandler for DefaultErrorHandler {
fn handle_error(&self, error: &FormError, context: &ErrorContext) {
log::error!("Form error: {} (context: {:?})", error, context);
}
fn should_log_error(&self, _error: &FormError) -> bool {
true
}
fn should_report_error(&self, error: &FormError) -> bool {
!error.is_field_error()
}
}
pub struct SilentErrorHandler;
impl ErrorHandler for SilentErrorHandler {
fn handle_error(&self, _error: &FormError, _context: &ErrorContext) {
}
fn should_log_error(&self, _error: &FormError) -> bool {
false
}
fn should_report_error(&self, _error: &FormError) -> bool {
false
}
}
pub struct VerboseErrorHandler;
impl ErrorHandler for VerboseErrorHandler {
fn handle_error(&self, error: &FormError, context: &ErrorContext) {
log::error!("Form error: {} (context: {:?})", error, context);
log::debug!("Error details: {:?}", error);
log::debug!("Context details: {:?}", context);
}
fn should_log_error(&self, _error: &FormError) -> bool {
true
}
fn should_report_error(&self, _error: &FormError) -> bool {
true
}
}
pub struct SelectiveErrorHandler {
log_field_errors: bool,
log_validation_errors: bool,
log_submission_errors: bool,
log_state_errors: bool,
log_persistence_errors: bool,
log_configuration_errors: bool,
log_unknown_errors: bool,
report_critical_errors: bool,
}
impl SelectiveErrorHandler {
pub fn new() -> Self {
Self {
log_field_errors: false,
log_validation_errors: true,
log_submission_errors: true,
log_state_errors: true,
log_persistence_errors: true,
log_configuration_errors: true,
log_unknown_errors: true,
report_critical_errors: true,
}
}
pub fn with_field_error_logging(mut self) -> Self {
self.log_field_errors = true;
self
}
pub fn without_validation_error_logging(mut self) -> Self {
self.log_validation_errors = false;
self
}
pub fn without_critical_error_reporting(mut self) -> Self {
self.report_critical_errors = false;
self
}
}
impl Default for SelectiveErrorHandler {
fn default() -> Self {
Self::new()
}
}
impl ErrorHandler for SelectiveErrorHandler {
fn handle_error(&self, error: &FormError, context: &ErrorContext) {
let should_log = match error {
FormError::FieldError { .. } => self.log_field_errors,
FormError::ValidationError { .. } => self.log_validation_errors,
FormError::SubmissionError { .. } => self.log_submission_errors,
FormError::StateError { .. } => self.log_state_errors,
FormError::PersistenceError { .. } => self.log_persistence_errors,
FormError::ConfigurationError { .. } => self.log_configuration_errors,
FormError::Unknown { .. } => self.log_unknown_errors,
FormError::SerializationError { .. } => true, };
if should_log {
log::error!("Form error: {} (context: {:?})", error, context);
}
}
fn should_log_error(&self, error: &FormError) -> bool {
match error {
FormError::FieldError { .. } => self.log_field_errors,
FormError::ValidationError { .. } => self.log_validation_errors,
FormError::SubmissionError { .. } => self.log_submission_errors,
FormError::StateError { .. } => self.log_state_errors,
FormError::PersistenceError { .. } => self.log_persistence_errors,
FormError::ConfigurationError { .. } => self.log_configuration_errors,
FormError::Unknown { .. } => self.log_unknown_errors,
FormError::SerializationError { .. } => true, }
}
fn should_report_error(&self, error: &FormError) -> bool {
if !self.report_critical_errors {
return false;
}
match error {
FormError::FieldError { .. } => false, FormError::ValidationError { .. } => false, FormError::SubmissionError { .. } => true, FormError::StateError { .. } => true, FormError::PersistenceError { .. } => true, FormError::ConfigurationError { .. } => true, FormError::Unknown { .. } => true, FormError::SerializationError { .. } => true, }
}
}