mago_type_syntax/ast/
shape.rs

1use 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}