Skip to main content

aphyn_reflection/
refl_repr.rs

1use std::fmt::Debug;
2
3// todo: ffi?
4
5#[derive(Clone)]
6pub enum ReflRepr {
7    Struct(ReflReprStruct),
8    Enum(ReflReprEnum),
9    Primitive(ReflReprPrimitive),
10}
11
12#[derive(Clone)]
13pub enum ReflReprPrimitive {
14    Int(i128),
15    Float(f64),
16    Char(char),
17    Str(String),
18    Bool(bool),
19    Unit,
20}
21
22#[derive(Clone)]
23pub struct ReflReprStruct {
24    pub name: String,
25    pub fields: ReflReprFields,
26}
27
28#[derive(Clone)]
29pub enum ReflReprFields {
30    Unit,
31    Tuple(Vec<ReflRepr>),
32    Named(Vec<(String, ReflRepr)>),
33}
34
35#[derive(Clone)]
36pub struct ReflReprEnum {
37    pub name: String,
38    pub variant: String,
39    pub fields: ReflReprFields,
40}
41
42impl Debug for ReflRepr {
43    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
44        match self {
45            ReflRepr::Struct(repr) => {
46                write!(f, "{} {:?}", &repr.name, &repr.fields)?;
47            }
48            ReflRepr::Enum(repr) => {
49                write!(f, "{}::{} {:?}", &repr.name, &repr.variant, &repr.fields)?;
50            }
51            ReflRepr::Primitive(repr) => match repr {
52                ReflReprPrimitive::Int(repr) => write!(f, "{}", repr)?,
53                ReflReprPrimitive::Float(repr) => write!(f, "{}", repr)?,
54                ReflReprPrimitive::Char(repr) => write!(f, "'{}'", repr)?,
55                ReflReprPrimitive::Str(repr) => write!(f, "\"{}\"", repr)?,
56                ReflReprPrimitive::Bool(repr) => write!(f, "{}", repr)?,
57                ReflReprPrimitive::Unit => write!(f, "()")?,
58            },
59        }
60
61        Ok(())
62    }
63}
64
65impl Debug for ReflReprFields {
66    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
67        match self {
68            ReflReprFields::Unit => (),
69            ReflReprFields::Tuple(fields) => {
70                write!(f, "(")?;
71                for (i, field_repr) in fields.iter().enumerate() {
72                    write!(f, "{:?}", field_repr)?;
73                    if i < fields.len() - 1 {
74                        write!(f, ", ")?;
75                    }
76                }
77                write!(f, ")")?;
78            }
79            ReflReprFields::Named(fields) => {
80                write!(f, "{{ ")?;
81                for (i, (field_name, field_repr)) in fields.iter().enumerate() {
82                    write!(f, "{}: {:?}", field_name, field_repr)?;
83                    if i < fields.len() - 1 {
84                        write!(f, ", ")?;
85                    }
86                }
87                write!(f, " }}")?;
88            }
89        }
90
91        Ok(())
92    }
93}
94
95// todo: generics?
96// todo: collections