1use crate::{attr, Field, Fields, Value};
2use std::fmt;
3use std::fmt::Debug;
4use std::marker::PhantomData;
5use syn::Attribute;
6
7#[derive(Debug, Clone)]
8pub enum Data<T> {
9 Struct(Struct<T>),
10 Enum(Enum<T>),
11}
12
13impl<T> Data<T> {
14 pub fn attrs(&self) -> &[Attribute] {
15 match self {
16 Data::Struct(s) => s.attrs(),
17 Data::Enum(e) => &e.attrs,
18 }
19 }
20}
21
22#[derive(Debug, Clone)]
23pub enum Struct<T> {
24 Unit(UnitStruct),
25 Tuple(TupleStruct<T>),
26 Struct(StructStruct<T>),
27}
28
29impl<T> Struct<T> {
30 pub fn attrs(&self) -> &[Attribute] {
31 match self {
32 Struct::Unit(us) => &us.attrs,
33 Struct::Tuple(ts) => &ts.attrs,
34 Struct::Struct(ss) => &ss.attrs,
35 }
36 }
37}
38
39#[derive(Clone)]
40pub struct UnitStruct {
41 pub(crate) attrs: Vec<Attribute>,
42}
43
44impl Debug for UnitStruct {
45 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
46 f.debug_struct("UnitStruct")
47 .field("attrs", attr::debug(&self.attrs))
48 .finish()
49 }
50}
51
52#[derive(Clone)]
53pub struct TupleStruct<T> {
54 pub(crate) fields: Vec<Field<T>>,
55 pub(crate) attrs: Vec<Attribute>,
56}
57
58impl<T: Debug> Debug for TupleStruct<T> {
59 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
60 f.debug_struct("TupleStruct")
61 .field("fields", &self.fields)
62 .field("attrs", attr::debug(&self.attrs))
63 .finish()
64 }
65}
66
67#[derive(Clone)]
68pub struct StructStruct<T> {
69 pub(crate) fields: Vec<Field<T>>,
70 pub(crate) attrs: Vec<Attribute>,
71}
72
73impl<T: Debug> Debug for StructStruct<T> {
74 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
75 f.debug_struct("StructStruct")
76 .field("fields", &self.fields)
77 .field("attrs", attr::debug(&self.attrs))
78 .finish()
79 }
80}
81
82impl<T> Struct<T> {
83 pub fn fields(&self) -> Fields<T>
84 where
85 T: Clone,
86 {
87 let fields = match self {
88 Struct::Unit(s) => Vec::new(),
89 Struct::Tuple(s) => s.fields.clone(),
90 Struct::Struct(s) => s.fields.clone(),
91 };
92 Fields {
93 fields: fields.into_iter(),
94 }
95 }
96}
97
98impl<T> TupleStruct<T> {
99 pub fn fields(&self) -> Fields<T>
100 where
101 T: Clone,
102 {
103 Fields {
104 fields: self.fields.clone().into_iter(),
105 }
106 }
107
108 pub fn attrs(&self) -> &[Attribute] {
109 &self.attrs
110 }
111}
112
113impl<T> StructStruct<T> {
114 pub fn fields(&self) -> Fields<T>
115 where
116 T: Clone,
117 {
118 Fields {
119 fields: self.fields.clone().into_iter(),
120 }
121 }
122
123 pub fn attrs(&self) -> &[Attribute] {
124 &self.attrs
125 }
126}
127
128#[derive(Clone)]
129pub struct Enum<T> {
130 pub(crate) variants: Vec<Variant<T>>,
131 pub(crate) attrs: Vec<Attribute>,
132}
133
134impl<T: Debug> Debug for Enum<T> {
135 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
136 f.debug_struct("Enum")
137 .field("variants", &self.variants)
138 .field("attrs", attr::debug(&self.attrs))
139 .finish()
140 }
141}
142
143impl Enum<Value> {
144 pub fn match_variant<Run>(&self, run: Run) -> Value
145 where
146 Run: Fn(Variant<Value>) -> Value,
147 {
148 let mut arms = Vec::new();
149 for variant in self.variants.clone() {
150 arms.push(run(variant));
151 }
152 unimplemented!()
154 }
155
156 pub fn attrs(&self) -> &[Attribute] {
157 &self.attrs
158 }
159}
160
161#[derive(Debug, Clone)]
162pub enum Variant<T> {
163 Unit(UnitVariant),
164 Tuple(TupleVariant<T>),
165 Struct(StructVariant<T>),
166}
167
168impl<T> Variant<T> {
169 pub fn attrs(&self) -> &[Attribute] {
170 match self {
171 Variant::Unit(uv) => &uv.attrs,
172 Variant::Tuple(tv) => &tv.attrs,
173 Variant::Struct(sv) => &sv.attrs,
174 }
175 }
176}
177
178#[derive(Clone)]
179pub struct UnitVariant {
180 pub(crate) attrs: Vec<Attribute>,
181}
182
183impl Debug for UnitVariant {
184 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
185 f.debug_struct("UnitVariant")
186 .field("attrs", attr::debug(&self.attrs))
187 .finish()
188 }
189}
190
191#[derive(Clone)]
192pub struct TupleVariant<T> {
193 pub(crate) phantom: PhantomData<T>,
194 pub(crate) attrs: Vec<Attribute>,
195}
196
197impl<T: Debug> Debug for TupleVariant<T> {
198 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
199 f.debug_struct("TupleVariant")
200 .field("attrs", attr::debug(&self.attrs))
201 .finish()
202 }
203}
204
205#[derive(Clone)]
206pub struct StructVariant<T> {
207 pub(crate) phantom: PhantomData<T>,
208 pub(crate) attrs: Vec<Attribute>,
209}
210
211impl<T: Debug> Debug for StructVariant<T> {
212 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
213 f.debug_struct("StructVariant")
214 .field("attrs", attr::debug(&self.attrs))
215 .finish()
216 }
217}