souvenir 0.3.1

Prefixed identifier library
Documentation
#[cfg(feature = "diesel-postgres")]
mod pg {
    use crate::{Id, Type};
    use diesel::pg::{Pg, PgValue};
    use diesel::{deserialize, serialize, sql_types::Uuid};
    use std::io::Write;

    impl<T: Type> serialize::ToSql<Uuid, Pg> for Id<T> {
        fn to_sql<'b>(&'b self, out: &mut serialize::Output<'b, '_, Pg>) -> serialize::Result {
            out.write_all(self.as_bytes())
                .map(|_| serialize::IsNull::No)
                .map_err(Into::into)
        }
    }

    impl<T: Type> deserialize::FromSql<Uuid, Pg> for Id<T> {
        fn from_sql(value: PgValue<'_>) -> deserialize::Result<Self> {
            value.as_bytes().try_into().map_err(Into::into)
        }
    }
}

#[cfg(feature = "diesel-mysql")]
mod mysql {
    use crate::{Id, Type};
    use diesel::mysql::{Mysql, MysqlValue};
    use diesel::{deserialize, serialize, sql_types::Binary};
    use std::io::Write;

    impl<T: Type> serialize::ToSql<Binary, Mysql> for Id<T> {
        fn to_sql<'b>(&'b self, out: &mut serialize::Output<'b, '_, Mysql>) -> serialize::Result {
            out.write_all(self.as_bytes())
                .map(|_| serialize::IsNull::No)
                .map_err(Into::into)
        }
    }

    impl<T: Type> deserialize::FromSql<Binary, Mysql> for Id<T> {
        fn from_sql(value: MysqlValue<'_>) -> deserialize::Result<Self> {
            value.as_bytes().try_into().map_err(Into::into)
        }
    }
}

#[cfg(feature = "diesel-sqlite")]
mod sqlite {
    use crate::{Id, Type};
    use diesel::sqlite::{Sqlite, SqliteValue};
    use diesel::{deserialize, serialize, sql_types::Text};

    impl<T: Type> serialize::ToSql<Text, Sqlite> for Id<T> {
        fn to_sql<'b>(&'b self, out: &mut serialize::Output<'b, '_, Sqlite>) -> serialize::Result {
            out.set_value(self.to_string());
            Ok(serialize::IsNull::No)
        }
    }

    impl<T: Type> deserialize::FromSql<Text, Sqlite> for Id<T> {
        fn from_sql(value: SqliteValue<'_, '_, '_>) -> deserialize::Result<Self> {
            <String as deserialize::FromSql<Text, Sqlite>>::from_sql(value)?
                .parse()
                .map_err(Into::into)
        }
    }
}