msgpack_tagged/
primitives.rs1use std::marker::PhantomData;
17
18use crate::{MsgpackTagged, TagRegistry, Tagged};
19
20const LEAF: Tagged = Tagged::empty_product();
21
22macro_rules! impl_msgpack_tagged_for_primitive {
23 ($($t:ty),* $(,)?) => {
24 $(
25 impl MsgpackTagged for $t {
26 const TAGGED: Tagged = LEAF;
27 fn register_into(_reg: &mut TagRegistry) {}
28 }
29 )*
30 };
31}
32
33impl_msgpack_tagged_for_primitive!(
34 (),
35 bool,
36 char,
37 u8,
38 u16,
39 u32,
40 u64,
41 u128,
42 usize,
43 i8,
44 i16,
45 i32,
46 i64,
47 i128,
48 isize,
49 f32,
50 f64,
51 String,
52);
53
54impl<T: 'static> MsgpackTagged for PhantomData<T> {
55 const TAGGED: Tagged = LEAF;
56 fn register_into(_reg: &mut TagRegistry) {}
57}
58
59#[cfg(test)]
60mod tests {
61 use super::*;
62
63 #[test]
67 fn each_primitive_satisfies_the_trait_bound() {
68 fn assert_impl<T: MsgpackTagged>() {}
69 assert_impl::<()>();
70 assert_impl::<bool>();
71 assert_impl::<char>();
72 assert_impl::<u8>();
73 assert_impl::<u16>();
74 assert_impl::<u32>();
75 assert_impl::<u64>();
76 assert_impl::<u128>();
77 assert_impl::<usize>();
78 assert_impl::<i8>();
79 assert_impl::<i16>();
80 assert_impl::<i32>();
81 assert_impl::<i64>();
82 assert_impl::<i128>();
83 assert_impl::<isize>();
84 assert_impl::<f32>();
85 assert_impl::<f64>();
86 assert_impl::<String>();
87 }
88
89 #[test]
94 fn primitives_dont_register_themselves() {
95 let mut reg = TagRegistry::new();
96 <()>::register_into(&mut reg);
97 <bool>::register_into(&mut reg);
98 <u32>::register_into(&mut reg);
99 <i64>::register_into(&mut reg);
100 <f64>::register_into(&mut reg);
101 <String>::register_into(&mut reg);
102 assert!(reg.is_empty());
103 }
104
105 struct Opaque;
108
109 #[test]
110 fn phantom_data_satisfies_the_trait_bound_without_t_msgpack_tagged() {
111 fn assert_impl<T: MsgpackTagged>() {}
112 assert_impl::<PhantomData<u32>>();
113 assert_impl::<PhantomData<Opaque>>();
114 }
115
116 #[test]
117 fn phantom_data_does_not_register_anything() {
118 let mut reg = TagRegistry::new();
119 <PhantomData<Opaque>>::register_into(&mut reg);
120 assert!(reg.is_empty());
121 }
122}