Getting ready for v1
This commit is contained in:
parent
9bef82126a
commit
77499cd98d
|
@ -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 {
|
||||||
|
}
|
|
@ -1,6 +1,5 @@
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
use serde::{Serialize, Deserialize};
|
use serde::{Serialize, Deserialize};
|
||||||
use uuid::Uuid;
|
|
||||||
|
|
||||||
use crate::domain::{property_details::ListingType};
|
use crate::domain::{property_details::ListingType};
|
||||||
|
|
||||||
|
@ -15,7 +14,10 @@ pub enum PropertyFilter {
|
||||||
Title(String),
|
Title(String),
|
||||||
Description(String),
|
Description(String),
|
||||||
|
|
||||||
Location(Uuid),
|
Country(String),
|
||||||
|
Province(String),
|
||||||
|
City(String),
|
||||||
|
District(String),
|
||||||
|
|
||||||
// By cost
|
// By cost
|
||||||
CheaperThan(ListingType),
|
CheaperThan(ListingType),
|
||||||
|
|
|
@ -4,3 +4,4 @@ pub mod location;
|
||||||
pub mod contact_info;
|
pub mod contact_info;
|
||||||
pub mod property_details;
|
pub mod property_details;
|
||||||
pub mod filters;
|
pub mod filters;
|
||||||
|
pub mod error;
|
|
@ -4,6 +4,8 @@ use serde::{Serialize, Deserialize};
|
||||||
use sqlx::{Postgres, postgres::{PgArgumentBuffer, PgValueRef, PgTypeInfo}, encode::IsNull, error::BoxDynError};
|
use sqlx::{Postgres, postgres::{PgArgumentBuffer, PgValueRef, PgTypeInfo}, encode::IsNull, error::BoxDynError};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
use super::error::InnerError;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, PartialOrd, Default)]
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, PartialOrd, Default)]
|
||||||
pub struct PropertyDetails {
|
pub struct PropertyDetails {
|
||||||
|
@ -45,7 +47,6 @@ pub struct Photos {
|
||||||
pub photos: Vec<String>
|
pub photos: Vec<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Database implementations
|
// Database implementations
|
||||||
|
|
||||||
impl sqlx::Encode<'_, Postgres> for Photos {
|
impl sqlx::Encode<'_, Postgres> for Photos {
|
||||||
|
@ -78,7 +79,7 @@ impl sqlx::Type<Postgres> for Photos {
|
||||||
|
|
||||||
impl sqlx::Encode<'_, Postgres> for ListingType {
|
impl sqlx::Encode<'_, Postgres> for ListingType {
|
||||||
fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> IsNull {
|
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<Postgres>>::encode(encoded_value.as_str(), buf)
|
<&str as sqlx::Encode<Postgres>>::encode(encoded_value.as_str(), buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,9 +87,17 @@ impl sqlx::Encode<'_, Postgres> for ListingType {
|
||||||
impl sqlx::Decode<'_, Postgres> for ListingType {
|
impl sqlx::Decode<'_, Postgres> for ListingType {
|
||||||
fn decode(value: PgValueRef<'_>) -> Result<Self, BoxDynError> {
|
fn decode(value: PgValueRef<'_>) -> Result<Self, BoxDynError> {
|
||||||
let column = value.as_str()?;
|
let column = value.as_str()?;
|
||||||
match serde_json::from_str(column) {
|
let col_split = column.split(" ").collect::<Vec<&str>>();
|
||||||
Ok(val) => Ok(val),
|
match *col_split.first().ok_or(Box::new(InnerError::ParsingFromDb))? {
|
||||||
Err(error) => Err(Box::new(error)),
|
"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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue