aphyn_reflection/
refl_repr_reg_entries.rs1use std::marker::PhantomData;
2
3use crate::{refl_repr::*, *};
4
5pub fn set_common_representers(reg: &mut ReflRepresenterRegistry) {
8 set_common_generic_item_representers_and_self(reg, U8ReflRepresenter::default());
9 set_common_generic_item_representers_and_self(reg, U16ReflRepresenter::default());
10 set_common_generic_item_representers_and_self(reg, U32ReflRepresenter::default());
11 set_common_generic_item_representers_and_self(reg, U64ReflRepresenter::default());
12 set_common_generic_item_representers_and_self(reg, U128ReflRepresenter::default());
13 set_common_generic_item_representers_and_self(reg, I8ReflRepresenter::default());
14 set_common_generic_item_representers_and_self(reg, I16ReflRepresenter::default());
15 set_common_generic_item_representers_and_self(reg, I32ReflRepresenter::default());
16 set_common_generic_item_representers_and_self(reg, I64ReflRepresenter::default());
17 set_common_generic_item_representers_and_self(reg, I128ReflRepresenter::default());
18 set_common_generic_item_representers_and_self(reg, F32ReflRepresenter::default());
19 set_common_generic_item_representers_and_self(reg, F64ReflRepresenter::default());
20 set_common_generic_item_representers_and_self(reg, CharReflRepresenter::default());
21 set_common_generic_item_representers_and_self(reg, StringReflRepresenter::default());
22}
23
24pub fn set_common_generic_representers<T: 'static>(reg: &mut ReflRepresenterRegistry) {
25 reg.set(Box::new(OptionReflRepresenter::<T>::default()));
26 reg.set(Box::new(VecReflRepresenter::<T>::default()));
27}
28
29pub fn set_common_generic_item_representers_and_self<T: 'static + ReflRepresenter>(
30 reg: &mut ReflRepresenterRegistry,
31 representer: T,
32) {
33 reg.set(Box::new(representer));
34 set_common_generic_representers::<T::Item>(reg);
35}
36
37macro_rules! refl_representer_primitive {
38 ($name: ident, $refl_prim: ident, $ty: ident) => {
39 #[derive(Default)]
40 struct $name;
41 impl ReflRepresenter for $name {
42 type Item = $ty;
43
44 fn item_name(&self, _ctx: &ReflRepresenterCtx) -> String {
45 String::from(stringify!($ty))
46 }
47
48 fn into_repr(&self, _ctx: &ReflRepresenterCtx, v: &Self::Item) -> Option<ReflRepr> {
49 Some(ReflRepr::Primitive(ReflReprPrimitive::$refl_prim(v.clone() as _)))
50 }
51 }
52 };
53}
54
55refl_representer_primitive! {U8ReflRepresenter, Int, u8}
56refl_representer_primitive! {U16ReflRepresenter, Int, u16}
57refl_representer_primitive! {U32ReflRepresenter, Int, u32}
58refl_representer_primitive! {U64ReflRepresenter, Int, u64}
59refl_representer_primitive! {U128ReflRepresenter, Int, u128}
60refl_representer_primitive! {I8ReflRepresenter, Int, i8}
61refl_representer_primitive! {I16ReflRepresenter, Int, i16}
62refl_representer_primitive! {I32ReflRepresenter, Int, i32}
63refl_representer_primitive! {I64ReflRepresenter, Int, i64}
64refl_representer_primitive! {I128ReflRepresenter, Int, i128}
65refl_representer_primitive! {F32ReflRepresenter, Float, f32}
66refl_representer_primitive! {F64ReflRepresenter, Float, f64}
67refl_representer_primitive! {CharReflRepresenter, Char, char}
68refl_representer_primitive! {StringReflRepresenter, Str, String}
69
70pub struct OptionReflRepresenter<T: 'static>(PhantomData<T>);
73impl<T: 'static> OptionReflRepresenter<T> {
74 pub const fn new() -> Self {
75 Self(PhantomData)
76 }
77}
78impl<T: 'static> Default for OptionReflRepresenter<T> {
79 fn default() -> Self {
80 Self::new()
81 }
82}
83impl<T: 'static> ReflRepresenter for OptionReflRepresenter<T> {
84 type Item = Option<T>;
85
86 fn item_name(&self, ctx: &ReflRepresenterCtx) -> String {
87 format!("Option<{}>", ctx.item_name::<T>().unwrap_or(String::from("")))
88 }
89
90 fn into_repr(&self, ctx: &ReflRepresenterCtx, v: &Self::Item) -> Option<ReflRepr> {
91 Some(match v {
92 Some(field) => ReflRepr::Enum(ReflReprEnum {
93 name: self.item_name(ctx),
94 variant: String::from("Some"),
95 fields: ReflReprFields::Tuple(vec![ctx.into_repr(field)?]),
96 }),
97 None => ReflRepr::Enum(ReflReprEnum {
98 name: self.item_name(ctx),
99 variant: String::from("None"),
100 fields: ReflReprFields::Unit,
101 }),
102 })
103 }
104}
105
106pub struct VecReflRepresenter<T: 'static>(PhantomData<T>);
107impl<T: 'static> VecReflRepresenter<T> {
108 pub const fn new() -> Self {
109 Self(PhantomData)
110 }
111}
112impl<T: 'static> Default for VecReflRepresenter<T> {
113 fn default() -> Self {
114 Self::new()
115 }
116}
117impl<T: 'static> ReflRepresenter for VecReflRepresenter<T> {
118 type Item = Vec<T>;
119
120 fn item_name(&self, ctx: &ReflRepresenterCtx) -> String {
121 format!("Vec<{}>", ctx.item_name::<T>().unwrap_or(String::from("")))
122 }
123
124 fn into_repr(&self, ctx: &ReflRepresenterCtx, v: &Self::Item) -> Option<ReflRepr> {
125 let mut fields = Vec::new();
126
127 for i in v {
128 fields.push(ctx.into_repr(i)?);
129 }
130
131 Some(ReflRepr::Struct(ReflReprStruct {
132 name: self.item_name(ctx),
133 fields: ReflReprFields::Tuple(fields),
134 }))
135 }
136}