1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use rusqlite::{types::FromSql, ToSql};
use std::{borrow::Borrow, convert::Infallible, marker::PhantomData, ops::Deref};

use crate::db;

use super::Serializer;

/// A Direct serializer, just serializing and deserializing types directly.
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())
    }
}