use rusqlite::{types::FromSql, ToSql};
use std::{borrow::Borrow, convert::Infallible, marker::PhantomData, ops::Deref};
use crate::db;
use super::Serializer;
pub struct Direct<Owned, Borrowed = <Owned as Deref>::Target>
where
Borrowed: ToSql + ?Sized + ToOwned<Owned = Owned>,
Owned: FromSql,
Owned: Borrow<Borrowed>,
{
owned: PhantomData<Owned>,
borrowed: PhantomData<Borrowed>,
}
impl<Owned, Borrowed> Serializer for Direct<Owned, Borrowed>
where
Borrowed: ToSql + ?Sized + ToOwned<Owned = Owned>,
Owned: FromSql,
Owned: Borrow<Borrowed>,
{
type Target = Owned;
type TargetBorrowed = Borrowed;
type Buffer = Owned;
type BufferBorrowed = Borrowed;
type SerializeError = Infallible;
type DeserializeError = Infallible;
fn sql_type() -> &'static str {
db::any()
}
fn serialize(object: &Self::TargetBorrowed) -> Result<Self::Buffer, Self::SerializeError> {
Ok(object.to_owned())
}
fn deserialize(data: &Self::BufferBorrowed) -> Result<Self::Target, Self::DeserializeError> {
Ok(data.to_owned())
}
}