use std::marker::PhantomData;
use specta::{
Type, Types,
datatype::{DataType, Reference},
};
pub struct Phased<Serialize, Deserialize>(PhantomData<(Serialize, Deserialize)>);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub(crate) struct PhasedTy {
pub(crate) serialize: DataType,
pub(crate) deserialize: DataType,
}
pub fn phased(serialize: DataType, deserialize: DataType) -> DataType {
if serialize == deserialize {
serialize
} else {
DataType::Reference(Reference::opaque(PhasedTy {
serialize,
deserialize,
}))
}
}
impl<Serialize: Type, Deserialize: Type> Type for Phased<Serialize, Deserialize> {
fn definition(types: &mut Types) -> DataType {
let serialize = Serialize::definition(types);
let deserialize = Deserialize::definition(types);
phased(serialize, deserialize)
}
}