use serde::{Deserialize, Serialize};
use std::fmt;
#[cfg(feature = "diesel")]
use std::io::Write;
#[cfg(feature = "diesel")]
use diesel::deserialize::{self, FromSql};
#[cfg(feature = "diesel")]
use diesel::serialize::{self, IsNull, Output, ToSql};
#[cfg(feature = "diesel")]
use diesel::sql_types::Text;
#[cfg(feature = "diesel")]
use diesel::mysql::{Mysql, MysqlValue};
#[derive(Debug, Deserialize, Serialize)]
pub struct CustomerRef {
pub handle: String,
pub handle_type: HandleType,
pub receiver_org_id: Option<String>,
}
impl CustomerRef {
pub fn new(handle: String, handle_type: HandleType) -> Self {
Self {
handle,
handle_type,
receiver_org_id: None,
}
}
pub fn with_receiver_org_id(mut self, receiver_org_id: String) -> Self {
self.receiver_org_id = Some(receiver_org_id);
self
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct SenderCustomerRef {
pub handle: String,
pub handle_type: HandleType,
pub receiver_org_id: String,
}
impl Into<CustomerRef> for SenderCustomerRef {
fn into(self) -> CustomerRef {
CustomerRef {
handle: self.handle,
handle_type: self.handle_type,
receiver_org_id: Some(self.receiver_org_id),
}
}
}
pub struct ReceiverCustomerRef {
pub handle: String,
pub handle_type: HandleType,
}
impl Into<CustomerRef> for ReceiverCustomerRef {
fn into(self) -> CustomerRef {
CustomerRef {
handle: self.handle,
handle_type: self.handle_type,
receiver_org_id: None,
}
}
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
#[cfg_attr(
feature = "diesel",
derive(diesel::expression::AsExpression, diesel::deserialize::FromSqlRow)
)]
#[cfg_attr(feature = "diesel", diesel(sql_type = Text))]
pub enum HandleType {
CustomerEmail,
CustomerEmailDomain,
MerchantGroupCode,
MerchantUserCode,
}
impl fmt::Display for HandleType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
HandleType::CustomerEmail => "customer_email",
HandleType::CustomerEmailDomain => "customer_email_domain",
HandleType::MerchantGroupCode => "merchant_group_code",
HandleType::MerchantUserCode => "merchant_user_code",
};
write!(f, "{}", s)
}
}
#[cfg(feature = "diesel")]
impl ToSql<Text, Mysql> for HandleType {
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, Mysql>) -> serialize::Result {
out.write_all(self.to_string().as_bytes())?;
Ok(IsNull::No)
}
}
#[cfg(feature = "diesel")]
impl FromSql<Text, Mysql> for HandleType {
fn from_sql(bytes: MysqlValue<'_>) -> deserialize::Result<Self> {
match bytes.as_bytes() {
b"customer_email" => Ok(HandleType::CustomerEmail),
b"customer_email_domain" => Ok(HandleType::CustomerEmailDomain),
b"merchant_group_code" => Ok(HandleType::MerchantGroupCode),
b"merchant_user_code" => Ok(HandleType::MerchantUserCode),
_ => Err("Unrecognized handle_type enum variant".into()),
}
}
}