bty 0.2.0

Streamlined definition and usage of branded types in Rust
Documentation
use sqlx_core::{
    database::{Database, HasArguments, HasValueRef},
    decode::Decode,
    encode::{Encode, IsNull},
    types::Type,
};

use crate::Brand;

type BoxError = Box<dyn core::error::Error + Send + Sync + 'static>;

impl<Db, Tag, Inner> Type<Db> for Brand<Tag, Inner>
where
    Db: Database,
    Inner: Type<Db>,
{
    fn type_info() -> Db::TypeInfo {
        Inner::type_info()
    }
}

impl<'de, Db, Tag, Inner> Decode<'de, Db> for Brand<Tag, Inner>
where
    Db: Database,
    Inner: for<'a> Decode<'a, Db>,
{
    fn decode(value: <Db as HasValueRef<'de>>::ValueRef) -> Result<Brand<Tag, Inner>, BoxError> {
        let inner = <Inner as Decode<Db>>::decode(value)?;
        Ok(Brand::unchecked_from_inner(inner))
    }
}

impl<'en, Db, Tag, Inner> Encode<'en, Db> for Brand<Tag, Inner>
where
    Db: Database,
    Inner: for<'a> Encode<'a, Db>,
{
    fn encode_by_ref(&self, buf: &mut <Db as HasArguments<'en>>::ArgumentBuffer) -> IsNull {
        self.inner.encode_by_ref(buf)
    }
}