trade_validation.rs (4714B)
1 #![forbid(unsafe_code)] 2 3 #[cfg(not(feature = "std"))] 4 use alloc::string::String; 5 6 use crate::listing::operational::OperationalListingParseError; 7 8 #[cfg_attr( 9 any(feature = "serde", test), 10 derive(serde::Serialize, serde::Deserialize) 11 )] 12 #[cfg_attr(all(test, feature = "std"), derive(dto_bindgen::Dto))] 13 #[cfg_attr(all(test, feature = "std"), dto(export))] 14 #[cfg_attr( 15 feature = "serde", 16 serde(rename_all = "snake_case", tag = "kind", content = "amount") 17 )] 18 #[derive(Clone, Debug, PartialEq, Eq)] 19 pub enum OperationalListingValidationError { 20 InvalidKind { kind: u32 }, 21 InvalidProfile, 22 MissingListingId, 23 ListingEventNotFound { listing_addr: String }, 24 ListingEventFetchFailed { listing_addr: String }, 25 ParseError { error: OperationalListingParseError }, 26 InvalidSeller, 27 MissingFarmProfile, 28 MissingFarmRecord, 29 MissingTitle, 30 MissingDescription, 31 MissingProductType, 32 MissingBins, 33 MissingPrimaryBin, 34 InvalidBin, 35 MissingPrice, 36 InvalidPrice, 37 MissingInventory, 38 InvalidInventory, 39 MissingAvailability, 40 MissingLocation, 41 MissingLocationLocality, 42 MissingLocationGeohash, 43 InvalidLocationGeohash, 44 MissingDeliveryMethod, 45 } 46 47 impl core::fmt::Display for OperationalListingValidationError { 48 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 49 match self { 50 Self::InvalidKind { kind } => write!(f, "invalid listing kind: {kind}"), 51 Self::InvalidProfile => { 52 write!( 53 f, 54 "classified listing is not an Operational Listing profile" 55 ) 56 } 57 Self::MissingListingId => write!(f, "missing listing id"), 58 Self::ListingEventNotFound { listing_addr } => { 59 write!(f, "listing event not found: {listing_addr}") 60 } 61 Self::ListingEventFetchFailed { listing_addr } => { 62 write!(f, "listing event fetch failed: {listing_addr}") 63 } 64 Self::ParseError { error } => write!(f, "invalid listing data: {error}"), 65 Self::InvalidSeller => write!(f, "listing author does not match farm pubkey"), 66 Self::MissingFarmProfile => write!(f, "missing farm profile"), 67 Self::MissingFarmRecord => write!(f, "missing farm record"), 68 Self::MissingTitle => write!(f, "missing listing title"), 69 Self::MissingDescription => write!(f, "missing listing description"), 70 Self::MissingProductType => write!(f, "missing listing product type"), 71 Self::MissingBins => write!(f, "missing listing bins"), 72 Self::MissingPrimaryBin => write!(f, "missing primary listing bin"), 73 Self::InvalidBin => write!(f, "invalid listing bin"), 74 Self::MissingPrice => write!(f, "missing listing price"), 75 Self::InvalidPrice => write!(f, "invalid listing price"), 76 Self::MissingInventory => write!(f, "missing listing inventory"), 77 Self::InvalidInventory => write!(f, "invalid listing inventory"), 78 Self::MissingAvailability => write!(f, "missing listing availability"), 79 Self::MissingLocation => write!(f, "missing listing location"), 80 Self::MissingLocationLocality => write!(f, "missing listing location locality"), 81 Self::MissingLocationGeohash => write!(f, "missing listing location geohash"), 82 Self::InvalidLocationGeohash => write!(f, "invalid listing location geohash"), 83 Self::MissingDeliveryMethod => write!(f, "missing listing delivery method"), 84 } 85 } 86 } 87 88 #[cfg(feature = "std")] 89 impl std::error::Error for OperationalListingValidationError {} 90 91 #[cfg(test)] 92 #[cfg_attr(coverage_nightly, coverage(off))] 93 mod tests { 94 use super::*; 95 96 #[test] 97 fn listing_validation_error_display_covers_location_variants() { 98 assert_eq!( 99 OperationalListingValidationError::InvalidProfile.to_string(), 100 "classified listing is not an Operational Listing profile" 101 ); 102 assert_eq!( 103 OperationalListingValidationError::MissingLocation.to_string(), 104 "missing listing location" 105 ); 106 assert_eq!( 107 OperationalListingValidationError::MissingLocationLocality.to_string(), 108 "missing listing location locality" 109 ); 110 assert_eq!( 111 OperationalListingValidationError::MissingLocationGeohash.to_string(), 112 "missing listing location geohash" 113 ); 114 assert_eq!( 115 OperationalListingValidationError::InvalidLocationGeohash.to_string(), 116 "invalid listing location geohash" 117 ); 118 } 119 }