mod dynamic;
pub use dynamic::{DynamicDeserialize, DynamicType};
#[cfg(feature = "serde_bytes")]
mod bytes;
#[cfg(feature = "enumflags2")]
mod enumflags2;
mod libstd;
mod net;
mod paths;
mod time;
#[cfg(feature = "uuid")]
mod uuid;
use crate::Signature;
pub trait Type {
const SIGNATURE: &'static Signature;
}
#[macro_export]
macro_rules! impl_type_with_repr {
($($ty:ident)::+ $(<$typaram:ident $(: $($tbound:ident)::+)?>)? => $repr:ty {
$test_mod:ident $(<$($typaram_sample:ident = $typaram_sample_value:ty),*>)? {
$(signature = $signature:literal,)?
samples = $samples:expr,
repr($sample_ident:ident) = $into_repr:expr,
}
}) => {
impl $(<$typaram $(: $($tbound)::+)?>)? $crate::Type for $($ty)::+ $(<$typaram>)? {
const SIGNATURE: &'static $crate::Signature = <$repr>::SIGNATURE;
}
#[cfg(test)]
#[allow(unused_imports)]
mod $test_mod {
use super::*;
use $crate::{serialized::Context, to_bytes, LE};
$($(type $typaram_sample = $typaram_sample_value;)*)?
type Ty = $($ty)::+$(<$typaram>)?;
const _: fn() = || {
fn assert_impl_all<'de, T: ?Sized + serde::Serialize + serde::Deserialize<'de>>() {}
assert_impl_all::<Ty>();
};
#[test]
fn type_can_be_deserialized_from_encoded_type() {
let ctx = Context::new_dbus(LE, 0);
let samples = $samples;
let _: &[Ty] = &samples;
for $sample_ident in samples {
let encoded = to_bytes(ctx, &$sample_ident).unwrap();
let (decoded, _): (Ty, _) = encoded.deserialize().unwrap();
assert_eq!($sample_ident, decoded);
}
}
#[test]
fn repr_can_be_deserialized_from_encoded_type() {
let ctx = Context::new_dbus(LE, 0);
let samples = $samples;
let _: &[Ty] = &samples;
for $sample_ident in samples {
let repr: $repr = $into_repr;
let encoded = to_bytes(ctx, &$sample_ident).unwrap();
let (decoded, _): ($repr, _) = encoded.deserialize().unwrap();
assert_eq!(repr, decoded);
}
}
#[test]
fn type_can_be_deserialized_from_encoded_repr() {
let ctx = Context::new_dbus(LE, 0);
let samples = $samples;
let _: &[Ty] = &samples;
for $sample_ident in samples {
let repr: $repr = $into_repr;
let encoded = to_bytes(ctx, &repr).unwrap();
let (decoded, _): (Ty, _) = encoded.deserialize().unwrap();
assert_eq!($sample_ident, decoded);
}
}
#[test]
fn encoding_of_type_and_repr_match() {
let ctx = Context::new_dbus(LE, 0);
let samples = $samples;
let _: &[Ty] = &samples;
for $sample_ident in samples {
let repr: $repr = $into_repr;
let encoded = to_bytes(ctx, &$sample_ident).unwrap();
let encoded_repr = to_bytes(ctx, &repr).unwrap();
assert_eq!(encoded.bytes(), encoded_repr.bytes());
}
}
$(
#[test]
fn signature_equals() {
assert_eq!(<Ty as $crate::Type>::SIGNATURE, $signature);
}
)?
}
};
}
#[macro_export]
#[allow(unused)]
macro_rules! static_str_type {
($ty:ty) => {
impl Type for $ty {
const SIGNATURE: &'static Signature = &Signature::Str;
}
};
}