mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-28 04:04:55 +08:00
Co-authored-by: dracarys18 <karthikey.hegde@juspay.in> Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
74 lines
1.9 KiB
Rust
74 lines
1.9 KiB
Rust
use diesel::{
|
|
backend::Backend,
|
|
deserialize::{self, FromSql, Queryable},
|
|
expression::AsExpression,
|
|
serialize::ToSql,
|
|
sql_types,
|
|
};
|
|
use masking::Secret;
|
|
|
|
use crate::{crypto::Encryptable, pii::EncryptionStrategy};
|
|
|
|
impl<DB> FromSql<sql_types::Binary, DB> for Encryption
|
|
where
|
|
DB: Backend,
|
|
Secret<Vec<u8>, EncryptionStrategy>: FromSql<sql_types::Binary, DB>,
|
|
{
|
|
fn from_sql(bytes: DB::RawValue<'_>) -> deserialize::Result<Self> {
|
|
<Secret<Vec<u8>, EncryptionStrategy>>::from_sql(bytes).map(Self::new)
|
|
}
|
|
}
|
|
|
|
impl<DB> ToSql<sql_types::Binary, DB> for Encryption
|
|
where
|
|
DB: Backend,
|
|
Secret<Vec<u8>, EncryptionStrategy>: ToSql<sql_types::Binary, DB>,
|
|
{
|
|
fn to_sql<'b>(
|
|
&'b self,
|
|
out: &mut diesel::serialize::Output<'b, '_, DB>,
|
|
) -> diesel::serialize::Result {
|
|
self.get_inner().to_sql(out)
|
|
}
|
|
}
|
|
|
|
impl<DB> Queryable<sql_types::Binary, DB> for Encryption
|
|
where
|
|
DB: Backend,
|
|
Secret<Vec<u8>, EncryptionStrategy>: FromSql<sql_types::Binary, DB>,
|
|
{
|
|
type Row = Secret<Vec<u8>, EncryptionStrategy>;
|
|
fn build(row: Self::Row) -> deserialize::Result<Self> {
|
|
Ok(Self { inner: row })
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, AsExpression, Clone, serde::Serialize, serde::Deserialize, Eq, PartialEq)]
|
|
#[diesel(sql_type = sql_types::Binary)]
|
|
#[repr(transparent)]
|
|
pub struct Encryption {
|
|
inner: Secret<Vec<u8>, EncryptionStrategy>,
|
|
}
|
|
|
|
impl<T: Clone> From<Encryptable<T>> for Encryption {
|
|
fn from(value: Encryptable<T>) -> Self {
|
|
Self::new(value.into_encrypted())
|
|
}
|
|
}
|
|
|
|
impl Encryption {
|
|
pub fn new(item: Secret<Vec<u8>, EncryptionStrategy>) -> Self {
|
|
Self { inner: item }
|
|
}
|
|
|
|
#[inline]
|
|
pub fn into_inner(self) -> Secret<Vec<u8>, EncryptionStrategy> {
|
|
self.inner
|
|
}
|
|
|
|
#[inline]
|
|
pub fn get_inner(&self) -> &Secret<Vec<u8>, EncryptionStrategy> {
|
|
&self.inner
|
|
}
|
|
}
|