prefixed-tsid 0.9.0

Create Stripe-style prefixed database IDs that are type-safe and portable
Documentation
use diesel::{deserialize::FromSql, pg::Pg, serialize::ToSql, sql_types::BigInt};

use crate::{resources::TSIDResource, tsid::TSIDDatabaseID};

impl<Resource: TSIDResource> ToSql<BigInt, Pg> for TSIDDatabaseID<Resource> {
    fn to_sql<'b>(
        &'b self,
        out: &mut diesel::serialize::Output<'b, '_, Pg>,
    ) -> diesel::serialize::Result {
        let val = self.to_raw_number() as i64;
        <i64 as ToSql<BigInt, Pg>>::to_sql(&val, &mut out.reborrow())
    }
}

impl<Resource: TSIDResource> FromSql<BigInt, Pg> for TSIDDatabaseID<Resource> {
    fn from_sql(
        bytes: <Pg as diesel::backend::Backend>::RawValue<'_>,
    ) -> diesel::deserialize::Result<Self> {
        let num = i64::from_sql(bytes)?;
        Ok(TSIDDatabaseID::<Resource>::from_raw_number(num as u64))
    }
}