1use super::{ArrayLen, NamedRef};
2use crate::Span;
3use crate::error::{
4 ExpectedTypeFoundConst, ExpectedTypeFoundService, InvalidKeyType, TypeNotFound,
5};
6use crate::grammar::Rule;
7use crate::validate::Validate;
8use pest::iterators::Pair;
9use std::fmt;
10
11#[derive(Debug, Clone)]
12pub struct TypeName {
13 span: Span,
14 kind: TypeNameKind,
15}
16
17impl TypeName {
18 pub(crate) fn parse(pair: Pair<Rule>) -> Self {
19 assert_eq!(pair.as_rule(), Rule::type_name);
20
21 let span = Span::from_pair(&pair);
22
23 let mut pairs = pair.into_inner();
24 let pair = pairs.next().unwrap();
25 let kind = TypeNameKind::parse(pair);
26
27 Self { span, kind }
28 }
29
30 pub(crate) fn validate(&self, is_key_type: bool, validate: &mut Validate) {
31 self.kind.validate(is_key_type, validate);
32 }
33
34 pub fn span(&self) -> Span {
35 self.span
36 }
37
38 pub fn kind(&self) -> &TypeNameKind {
39 &self.kind
40 }
41}
42
43#[derive(Debug, Clone)]
44pub enum TypeNameKind {
45 Bool,
46 U8,
47 I8,
48 U16,
49 I16,
50 U32,
51 I32,
52 U64,
53 I64,
54 F32,
55 F64,
56 String,
57 Uuid,
58 ObjectId,
59 ServiceId,
60 Value,
61 Option(Box<TypeName>),
62 Box(Box<TypeName>),
63 Vec(Box<TypeName>),
64 Bytes,
65 Map(Box<TypeName>, Box<TypeName>),
66 Set(Box<TypeName>),
67 Sender(Box<TypeName>),
68 Receiver(Box<TypeName>),
69 Lifetime,
70 Unit,
71 Result(Box<TypeName>, Box<TypeName>),
72 Array(Box<TypeName>, ArrayLen),
73 Ref(NamedRef),
74}
75
76impl TypeNameKind {
77 fn parse(pair: Pair<Rule>) -> Self {
78 #[expect(clippy::wildcard_enum_match_arm)]
79 match pair.as_rule() {
80 Rule::kw_bool => Self::Bool,
81 Rule::kw_u8 => Self::U8,
82 Rule::kw_i8 => Self::I8,
83 Rule::kw_u16 => Self::U16,
84 Rule::kw_i16 => Self::I16,
85 Rule::kw_u32 => Self::U32,
86 Rule::kw_i32 => Self::I32,
87 Rule::kw_u64 => Self::U64,
88 Rule::kw_i64 => Self::I64,
89 Rule::kw_f32 => Self::F32,
90 Rule::kw_f64 => Self::F64,
91 Rule::kw_string => Self::String,
92 Rule::kw_uuid => Self::Uuid,
93 Rule::kw_object_id => Self::ObjectId,
94 Rule::kw_service_id => Self::ServiceId,
95 Rule::kw_value => Self::Value,
96 Rule::kw_lifetime => Self::Lifetime,
97 Rule::kw_unit => Self::Unit,
98
99 Rule::option_type => {
100 let mut pairs = pair.into_inner();
101 pairs.next().unwrap(); pairs.next().unwrap(); let pair = pairs.next().unwrap();
104
105 Self::Option(Box::new(TypeName::parse(pair)))
106 }
107
108 Rule::box_type => {
109 let mut pairs = pair.into_inner();
110 pairs.next().unwrap(); pairs.next().unwrap(); let pair = pairs.next().unwrap();
113
114 Self::Box(Box::new(TypeName::parse(pair)))
115 }
116
117 Rule::vec_type => {
118 let mut pairs = pair.into_inner();
119 pairs.next().unwrap(); pairs.next().unwrap(); let pair = pairs.next().unwrap();
122
123 Self::Vec(Box::new(TypeName::parse(pair)))
124 }
125
126 Rule::kw_bytes => Self::Bytes,
127
128 Rule::map_type => {
129 let mut pairs = pair.into_inner();
130 pairs.next().unwrap(); pairs.next().unwrap(); let key_pair = pairs.next().unwrap();
133 pairs.next().unwrap(); let type_pair = pairs.next().unwrap();
135
136 Self::Map(
137 Box::new(TypeName::parse(key_pair)),
138 Box::new(TypeName::parse(type_pair)),
139 )
140 }
141
142 Rule::set_type => {
143 let mut pairs = pair.into_inner();
144 pairs.next().unwrap(); pairs.next().unwrap(); let pair = pairs.next().unwrap();
147
148 Self::Set(Box::new(TypeName::parse(pair)))
149 }
150
151 Rule::sender_type => {
152 let mut pairs = pair.into_inner();
153 pairs.next().unwrap(); pairs.next().unwrap(); let pair = pairs.next().unwrap();
156
157 Self::Sender(Box::new(TypeName::parse(pair)))
158 }
159
160 Rule::receiver_type => {
161 let mut pairs = pair.into_inner();
162 pairs.next().unwrap(); pairs.next().unwrap(); let pair = pairs.next().unwrap();
165
166 Self::Receiver(Box::new(TypeName::parse(pair)))
167 }
168
169 Rule::result_type => {
170 let mut pairs = pair.into_inner();
171 pairs.next().unwrap(); pairs.next().unwrap(); let ok_pair = pairs.next().unwrap();
174 pairs.next().unwrap(); let err_pair = pairs.next().unwrap();
176
177 Self::Result(
178 Box::new(TypeName::parse(ok_pair)),
179 Box::new(TypeName::parse(err_pair)),
180 )
181 }
182
183 Rule::array_type => {
184 let mut pairs = pair.into_inner();
185 pairs.next().unwrap(); let type_pair = pairs.next().unwrap();
187 pairs.next().unwrap(); let len_pair = pairs.next().unwrap();
189
190 Self::Array(
191 Box::new(TypeName::parse(type_pair)),
192 ArrayLen::parse(len_pair),
193 )
194 }
195
196 Rule::named_ref => Self::Ref(NamedRef::parse(pair)),
197
198 _ => unreachable!(),
199 }
200 }
201
202 fn validate(&self, is_key_type: bool, validate: &mut Validate) {
203 match self {
204 Self::Option(ty)
205 | Self::Box(ty)
206 | Self::Vec(ty)
207 | Self::Sender(ty)
208 | Self::Receiver(ty) => ty.validate(false, validate),
209
210 Self::Map(k, t) => {
211 InvalidKeyType::validate(k, validate);
212 k.validate(true, validate);
213 t.validate(false, validate);
214 }
215
216 Self::Set(ty) => {
217 InvalidKeyType::validate(ty, validate);
218 ty.validate(true, validate);
219 }
220
221 Self::Result(ok, err) => {
222 ok.validate(false, validate);
223 err.validate(false, validate);
224 }
225
226 Self::Array(ty, len) => {
227 ty.validate(false, validate);
228 len.validate(validate);
229 }
230
231 Self::Ref(ty) => {
232 TypeNotFound::validate(ty, is_key_type, validate);
233 ExpectedTypeFoundService::validate(ty, is_key_type, validate);
234 ExpectedTypeFoundConst::validate(ty, is_key_type, validate);
235 ty.validate(validate);
236 }
237
238 Self::Bool
239 | Self::U8
240 | Self::I8
241 | Self::U16
242 | Self::I16
243 | Self::U32
244 | Self::I32
245 | Self::U64
246 | Self::I64
247 | Self::F32
248 | Self::F64
249 | Self::String
250 | Self::Uuid
251 | Self::ObjectId
252 | Self::ServiceId
253 | Self::Value
254 | Self::Bytes
255 | Self::Lifetime
256 | Self::Unit => {}
257 }
258 }
259}
260
261impl fmt::Display for TypeNameKind {
262 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
263 match self {
264 Self::Bool => write!(f, "bool"),
265 Self::U8 => write!(f, "u8"),
266 Self::I8 => write!(f, "i8"),
267 Self::U16 => write!(f, "u16"),
268 Self::I16 => write!(f, "i16"),
269 Self::U32 => write!(f, "u32"),
270 Self::I32 => write!(f, "i32"),
271 Self::U64 => write!(f, "u64"),
272 Self::I64 => write!(f, "i64"),
273 Self::F32 => write!(f, "f32"),
274 Self::F64 => write!(f, "f64"),
275 Self::String => write!(f, "string"),
276 Self::Uuid => write!(f, "uuid"),
277 Self::ObjectId => write!(f, "object_id"),
278 Self::ServiceId => write!(f, "service_id"),
279 Self::Value => write!(f, "value"),
280 Self::Option(ty) => write!(f, "option<{}>", ty.kind()),
281 Self::Box(ty) => write!(f, "box<{}>", ty.kind()),
282 Self::Vec(ty) => write!(f, "vec<{}>", ty.kind()),
283 Self::Bytes => write!(f, "bytes"),
284 Self::Map(k, t) => write!(f, "map<{} -> {}>", k.kind(), t.kind()),
285 Self::Set(ty) => write!(f, "set<{}>", ty.kind()),
286 Self::Sender(ty) => write!(f, "sender<{}>", ty.kind()),
287 Self::Receiver(ty) => write!(f, "receiver<{}>", ty.kind()),
288 Self::Lifetime => write!(f, "lifetime"),
289 Self::Unit => write!(f, "unit"),
290 Self::Result(ok, err) => write!(f, "result<{}, {}>", ok.kind(), err.kind()),
291 Self::Array(ty, len) => write!(f, "[{}; {}]", ty.kind(), len.value()),
292 Self::Ref(ty) => ty.kind().fmt(f),
293 }
294 }
295}