mago_type_syntax/ast/
shape.rs1use serde::Serialize;
2use strum::Display;
3
4use mago_span::HasSpan;
5use mago_span::Span;
6
7use crate::ast::Type;
8use crate::ast::generics::GenericParameters;
9use crate::ast::keyword::Keyword;
10
11#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord, Display)]
12#[serde(tag = "type", content = "value")]
13#[repr(C)]
14pub enum ShapeTypeKind {
15 Array,
16 NonEmptyArray,
17 AssociativeArray,
18 List,
19 NonEmptyList,
20}
21
22#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
23#[repr(C)]
24pub struct ShapeType<'input> {
25 pub kind: ShapeTypeKind,
26 pub keyword: Keyword<'input>,
27 pub left_brace: Span,
28 pub fields: Vec<ShapeField<'input>>,
29 pub additional_fields: Option<ShapeAdditionalFields<'input>>,
30 pub right_brace: Span,
31}
32
33#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
34#[repr(C)]
35pub struct ShapeField<'input> {
36 pub key: Box<Type<'input>>,
37 pub question_mark: Option<Span>,
38 pub colon: Span,
39 pub value: Box<Type<'input>>,
40 pub comma: Option<Span>,
41}
42
43#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
44#[repr(C)]
45pub struct ShapeAdditionalFields<'input> {
46 pub ellipsis: Span,
47 pub parameters: Option<GenericParameters<'input>>,
48}
49
50impl HasSpan for ShapeType<'_> {
51 fn span(&self) -> Span {
52 self.keyword.span().join(self.right_brace)
53 }
54}
55
56impl HasSpan for ShapeField<'_> {
57 fn span(&self) -> Span {
58 match &self.comma {
59 Some(comma) => self.key.span().join(*comma),
60 None => self.key.span(),
61 }
62 }
63}
64
65impl HasSpan for ShapeAdditionalFields<'_> {
66 fn span(&self) -> Span {
67 match &self.parameters {
68 Some(generics) => self.ellipsis.join(generics.span()),
69 None => self.ellipsis,
70 }
71 }
72}