Skip to main content

aphyn_reflection/
refl_ty.rs

1// todo: ffi?
2
3#[derive(Hash, PartialEq, Eq, PartialOrd, Ord)]
4pub struct ReflTyId(String);
5
6impl ReflTyId {
7    pub fn of<T>() -> Self {
8        // todo: use something more reliable
9        Self(String::from(std::any::type_name::<T>()))
10    }
11}
12
13pub enum ReflTy {
14    Struct(ReflTyStruct),
15    Enum(ReflTyEnum),
16    Array(ReflTyId, u64),
17    Slice(ReflTyId),
18}
19
20pub struct ReflTyEnum {
21    pub variants: Vec<(String, ReflTyStruct)>,
22}
23
24pub enum ReflTyStruct {
25    Unit,
26    Tuple(Vec<ReflTyId>),
27    Named(Vec<(String, ReflTyId)>),
28}
29
30// todo: generics
31// todo: collections
32
33// example
34
35struct ExampleStruct {
36    pub age: u8,
37    pub name: String,
38}
39
40fn example_struct_refl_ty() -> ReflTy {
41    ReflTy::Struct(ReflTyStruct::Named(
42        [
43            (String::from("age"), ReflTyId::of::<u8>()),
44            (String::from("name"), ReflTyId::of::<String>()),
45        ]
46        .into_iter()
47        .collect(),
48    ))
49}
50
51enum ExampleEnum {
52    None,
53    Age(u8),
54    Creds { email: String, password: String },
55}
56
57fn example_enum_refl_ty() -> ReflTy {
58    ReflTy::Enum(ReflTyEnum {
59        variants: vec![
60            (String::from("None"), ReflTyStruct::Unit),
61            (String::from("Age"), ReflTyStruct::Tuple(vec![ReflTyId::of::<u8>()])),
62            (
63                String::from("Creds"),
64                ReflTyStruct::Named(vec![
65                    (String::from("email"), ReflTyId::of::<String>()),
66                    (String::from("password"), ReflTyId::of::<String>()),
67                ]),
68            ),
69        ],
70    })
71}
72
73fn option_enum_refl_ty(t: ReflTyId) -> ReflTy {
74    ReflTy::Enum(ReflTyEnum {
75        variants: vec![
76            (String::from("None"), ReflTyStruct::Unit),
77            (String::from("Age"), ReflTyStruct::Tuple(vec![t])),
78        ],
79    })
80}
81
82fn array_f32_10_refl_ty() -> ReflTy {
83    ReflTy::Array(ReflTyId::of::<f32>(), 10)
84}
85
86fn vec_f32_refl_ty() -> ReflTy {
87    ReflTy::Slice(ReflTyId::of::<f32>())
88}