error.rs (3286B)
1 #[cfg(not(feature = "std"))] 2 use alloc::string::{String, ToString}; 3 4 use core::fmt; 5 6 use radroots_events_codec::error::{EventEncodeError, EventParseError}; 7 use radroots_sql_core::error::SqlError; 8 use radroots_types::types::IError; 9 10 #[derive(Debug)] 11 pub enum RadrootsReplicaEventsError { 12 Sql(IError<SqlError>), 13 Encode(EventEncodeError), 14 Parse(EventParseError), 15 InvalidSelector(String), 16 InvalidData(String), 17 } 18 19 impl fmt::Display for RadrootsReplicaEventsError { 20 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 21 match self { 22 Self::Sql(err) => write!(f, "replica_sync.sql: {}", err.err), 23 Self::Encode(err) => write!(f, "replica_sync.encode: {err}"), 24 Self::Parse(err) => write!(f, "replica_sync.parse: {err}"), 25 Self::InvalidSelector(msg) => write!(f, "replica_sync.selector: {msg}"), 26 Self::InvalidData(msg) => write!(f, "replica_sync.data: {msg}"), 27 } 28 } 29 } 30 31 #[cfg(feature = "std")] 32 impl std::error::Error for RadrootsReplicaEventsError {} 33 34 impl From<IError<SqlError>> for RadrootsReplicaEventsError { 35 fn from(err: IError<SqlError>) -> Self { 36 Self::Sql(err) 37 } 38 } 39 40 impl From<EventEncodeError> for RadrootsReplicaEventsError { 41 fn from(err: EventEncodeError) -> Self { 42 Self::Encode(err) 43 } 44 } 45 46 impl From<EventParseError> for RadrootsReplicaEventsError { 47 fn from(err: EventParseError) -> Self { 48 Self::Parse(err) 49 } 50 } 51 52 #[cfg(test)] 53 mod tests { 54 use super::RadrootsReplicaEventsError; 55 use radroots_events_codec::error::{EventEncodeError, EventParseError}; 56 use radroots_sql_core::error::SqlError; 57 use radroots_types::types::IError; 58 59 #[test] 60 fn display_formats_all_error_variants() { 61 let sql_err = RadrootsReplicaEventsError::Sql(IError::from(SqlError::Internal)); 62 assert!(sql_err.to_string().contains("replica_sync.sql")); 63 64 let encode_err = RadrootsReplicaEventsError::Encode(EventEncodeError::InvalidField("name")); 65 assert!(encode_err.to_string().contains("replica_sync.encode")); 66 67 let parse_err = RadrootsReplicaEventsError::Parse(EventParseError::InvalidTag("d")); 68 assert!(parse_err.to_string().contains("replica_sync.parse")); 69 70 let selector_err = 71 RadrootsReplicaEventsError::InvalidSelector("selector missing".to_string()); 72 assert!(selector_err.to_string().contains("replica_sync.selector")); 73 74 let data_err = RadrootsReplicaEventsError::InvalidData("bad data".to_string()); 75 assert!(data_err.to_string().contains("replica_sync.data")); 76 } 77 78 #[test] 79 fn from_impls_map_into_expected_variants() { 80 let sql_from: RadrootsReplicaEventsError = IError::from(SqlError::Internal).into(); 81 assert!(sql_from.to_string().contains("replica_sync.sql")); 82 83 let encode_from: RadrootsReplicaEventsError = EventEncodeError::Json.into(); 84 assert!(encode_from.to_string().contains("replica_sync.encode")); 85 86 let parse_number_err = "invalid".parse::<u32>().expect_err("parse int should fail"); 87 let parse_from: RadrootsReplicaEventsError = 88 EventParseError::InvalidNumber("k", parse_number_err).into(); 89 assert!(parse_from.to_string().contains("replica_sync.parse")); 90 } 91 }