versa 1.9.0-rc2

Versa types and utilities for developing Versa client applications in Rust
Documentation
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()),
    }
  }
}