use diesel::{
backend::Backend,
deserialize::FromSql,
serialize::{Output, ToSql},
sql_types::Binary,
};
use crate::{Digested, Encrypted, Secret, Signed, Tagged};
impl<T, DB> FromSql<Binary, DB> for Encrypted<T>
where
DB: Backend,
Vec<u8>: FromSql<Binary, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> diesel::deserialize::Result<Self> {
Ok(Self::new(Vec::<u8>::from_sql(bytes)?))
}
}
impl<T, DB> ToSql<Binary, DB> for Encrypted<T>
where
T: std::fmt::Debug,
DB: Backend,
Vec<u8>: ToSql<Binary, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> diesel::serialize::Result {
self.bytes.to_sql(out)
}
}
impl<T, DB> FromSql<Binary, DB> for Secret<T>
where
DB: Backend,
Vec<u8>: FromSql<Binary, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> diesel::deserialize::Result<Self> {
Ok(Self::new(Vec::<u8>::from_sql(bytes)?))
}
}
impl<T, DB> ToSql<Binary, DB> for Secret<T>
where
T: std::fmt::Debug,
DB: Backend,
Vec<u8>: ToSql<Binary, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> diesel::serialize::Result {
self.bytes.to_sql(out)
}
}
impl<T, DB> FromSql<Binary, DB> for Digested<T>
where
DB: Backend,
Vec<u8>: FromSql<Binary, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> diesel::deserialize::Result<Self> {
Ok(Self::new(Vec::<u8>::from_sql(bytes)?))
}
}
impl<T, DB> ToSql<Binary, DB> for Digested<T>
where
T: std::fmt::Debug,
DB: Backend,
Vec<u8>: ToSql<Binary, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> diesel::serialize::Result {
self.bytes.to_sql(out)
}
}
impl<T, DB> FromSql<Binary, DB> for Signed<T>
where
DB: Backend,
Vec<u8>: FromSql<Binary, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> diesel::deserialize::Result<Self> {
Ok(Self::new(Vec::<u8>::from_sql(bytes)?))
}
}
impl<T, DB> ToSql<Binary, DB> for Signed<T>
where
T: std::fmt::Debug,
DB: Backend,
Vec<u8>: ToSql<Binary, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> diesel::serialize::Result {
self.bytes.to_sql(out)
}
}
impl<T, DB> FromSql<Binary, DB> for Tagged<T>
where
DB: Backend,
Vec<u8>: FromSql<Binary, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> diesel::deserialize::Result<Self> {
Ok(Self::new(Vec::<u8>::from_sql(bytes)?))
}
}
impl<T, DB> ToSql<Binary, DB> for Tagged<T>
where
T: std::fmt::Debug,
DB: Backend,
Vec<u8>: ToSql<Binary, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> diesel::serialize::Result {
self.bytes.to_sql(out)
}
}