Skip to main content

aphyn_reflection/
refl_repr_reg_entries.rs

1use std::marker::PhantomData;
2
3use crate::{refl_repr::*, *};
4
5// todo: ffi?
6
7pub 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
70//
71
72pub 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}