encrypted-message 0.3.0

Safely encrypt & store serializable data using AES-256-GCM.
Documentation
use std::fmt::Debug;

use diesel::{
    deserialize::FromSql,
    serialize::ToSql,
    backend::Backend,
    sql_types,
};
use serde::{Serialize, de::DeserializeOwned};

use crate::{EncryptedMessage, config::Config};

macro_rules! impl_from_and_to_sql {
    ($($sql_type:ty, $backend:ty),+ $(,)?) => {
        $(
            impl<P: Debug + DeserializeOwned + Serialize, C: Config> FromSql<$sql_type, $backend> for EncryptedMessage<P, C> {
                fn from_sql(value: <$backend as Backend>::RawValue<'_>) -> diesel::deserialize::Result<Self> {
                    let json: serde_json::Value = FromSql::<$sql_type, $backend>::from_sql(value)?;

                    Ok(serde_json::from_value(json)?)
                }
            }

            impl<P: Debug + DeserializeOwned + Serialize, C: Config> ToSql<$sql_type, $backend> for EncryptedMessage<P, C> {
                fn to_sql<'b>(&'b self, out: &mut diesel::serialize::Output<'b, '_, $backend>) -> diesel::serialize::Result {
                    let json = serde_json::to_value(self)?;

                    ToSql::<$sql_type, $backend>::to_sql(&json, &mut out.reborrow())
                }
            }
        )+
    };
}

#[cfg(feature = "diesel-mysql")]
impl_from_and_to_sql!(sql_types::Json, diesel::mysql::Mysql);

#[cfg(feature = "diesel-postgres")]
impl_from_and_to_sql!(
    sql_types::Json, diesel::pg::Pg,
    sql_types::Jsonb, diesel::pg::Pg,
);