From 77499cd98d95fa41bd97811b7656aae3de25564a Mon Sep 17 00:00:00 2001 From: Franklin Date: Sat, 11 Mar 2023 14:31:12 -0400 Subject: [PATCH] Getting ready for v1 --- src/domain/error.rs | 21 +++++++++++++++++++++ src/domain/filters/property.rs | 6 ++++-- src/domain/mod.rs | 3 ++- src/domain/property_details/mod.rs | 19 ++++++++++++++----- 4 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 src/domain/error.rs diff --git a/src/domain/error.rs b/src/domain/error.rs new file mode 100644 index 0000000..09ac29c --- /dev/null +++ b/src/domain/error.rs @@ -0,0 +1,21 @@ +use std::fmt::Display; + +use serde::Serialize; + + + +#[derive(Debug, Clone, Copy, Serialize, Default, PartialEq, Eq, PartialOrd, Ord)] +pub enum InnerError { + #[default] + ParsingFromDb +} + +impl Display for InnerError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::ParsingFromDb => write!(f, "Couldn't parse string to type from DB.") + } + } +} +impl std::error::Error for InnerError { +} \ No newline at end of file diff --git a/src/domain/filters/property.rs b/src/domain/filters/property.rs index 817e88e..3bda525 100644 --- a/src/domain/filters/property.rs +++ b/src/domain/filters/property.rs @@ -1,6 +1,5 @@ use chrono::{DateTime, Utc}; use serde::{Serialize, Deserialize}; -use uuid::Uuid; use crate::domain::{property_details::ListingType}; @@ -15,7 +14,10 @@ pub enum PropertyFilter { Title(String), Description(String), - Location(Uuid), + Country(String), + Province(String), + City(String), + District(String), // By cost CheaperThan(ListingType), diff --git a/src/domain/mod.rs b/src/domain/mod.rs index a236853..1dbf02d 100644 --- a/src/domain/mod.rs +++ b/src/domain/mod.rs @@ -3,4 +3,5 @@ pub mod property; pub mod location; pub mod contact_info; pub mod property_details; -pub mod filters; \ No newline at end of file +pub mod filters; +pub mod error; \ No newline at end of file diff --git a/src/domain/property_details/mod.rs b/src/domain/property_details/mod.rs index 2c5c78e..ab72252 100644 --- a/src/domain/property_details/mod.rs +++ b/src/domain/property_details/mod.rs @@ -4,6 +4,8 @@ use serde::{Serialize, Deserialize}; use sqlx::{Postgres, postgres::{PgArgumentBuffer, PgValueRef, PgTypeInfo}, encode::IsNull, error::BoxDynError}; use uuid::Uuid; +use super::error::InnerError; +use std::str::FromStr; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, PartialOrd, Default)] pub struct PropertyDetails { @@ -45,7 +47,6 @@ pub struct Photos { pub photos: Vec } - // Database implementations impl sqlx::Encode<'_, Postgres> for Photos { @@ -78,7 +79,7 @@ impl sqlx::Type for Photos { impl sqlx::Encode<'_, Postgres> for ListingType { fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> IsNull { - let encoded_value = serde_json::to_string(self).unwrap(); + let encoded_value = self.to_string(); <&str as sqlx::Encode>::encode(encoded_value.as_str(), buf) } } @@ -86,9 +87,17 @@ impl sqlx::Encode<'_, Postgres> for ListingType { impl sqlx::Decode<'_, Postgres> for ListingType { fn decode(value: PgValueRef<'_>) -> Result { let column = value.as_str()?; - match serde_json::from_str(column) { - Ok(val) => Ok(val), - Err(error) => Err(Box::new(error)), + let col_split = column.split(" ").collect::>(); + match *col_split.first().ok_or(Box::new(InnerError::ParsingFromDb))? { + "rent" => Ok(Self::Rent(f64::from_str(*col_split.get(1).ok_or(Box::new(InnerError::ParsingFromDb))?)?)), + "sale" => Ok(Self::Sale(f64::from_str(*col_split.get(1).ok_or(Box::new(InnerError::ParsingFromDb))?)?)), + "both" => Ok(Self::Both( + f64::from_str(*col_split.get(1).ok_or(Box::new(InnerError::ParsingFromDb))?)?, + f64::from_str(*col_split.get(2).ok_or(Box::new(InnerError::ParsingFromDb))?)?, + )), + _ => { + Err(Box::new(InnerError::ParsingFromDb)) + } } } }