use common_utils::pii::EncryptionStratergy; use diesel::{ backend::Backend, deserialize::{self, FromSql, Queryable}, serialize::ToSql, sql_types, AsExpression, }; use masking::Secret; #[derive(Debug, AsExpression, Clone, serde::Serialize, serde::Deserialize, Eq, PartialEq)] #[diesel(sql_type = diesel::sql_types::Binary)] #[repr(transparent)] pub struct Encryption { inner: Secret, EncryptionStratergy>, } impl From> for Encryption { fn from(value: common_utils::crypto::Encryptable) -> Self { Self::new(value.into_encrypted()) } } impl Encryption { pub fn new(item: Secret, EncryptionStratergy>) -> Self { Self { inner: item } } #[inline] pub fn into_inner(self) -> Secret, EncryptionStratergy> { self.inner } #[inline] pub fn get_inner(&self) -> &Secret, EncryptionStratergy> { &self.inner } } impl FromSql for Encryption where DB: Backend, Secret, EncryptionStratergy>: FromSql, { fn from_sql(bytes: DB::RawValue<'_>) -> diesel::deserialize::Result { , EncryptionStratergy>>::from_sql(bytes).map(Self::new) } } impl ToSql for Encryption where DB: Backend, Secret, EncryptionStratergy>: ToSql, { fn to_sql<'b>( &'b self, out: &mut diesel::serialize::Output<'b, '_, DB>, ) -> diesel::serialize::Result { self.get_inner().to_sql(out) } } impl Queryable for Encryption where DB: Backend, Secret, EncryptionStratergy>: FromSql, { type Row = Secret, EncryptionStratergy>; fn build(row: Self::Row) -> deserialize::Result { Ok(Self { inner: row }) } }