mago_syntax/ast/ast/
literal.rs

1use ordered_float::OrderedFloat;
2use serde::Deserialize;
3use serde::Serialize;
4use strum::Display;
5
6use mago_interner::StringIdentifier;
7use mago_span::HasSpan;
8use mago_span::Span;
9
10use crate::ast::ast::keyword::Keyword;
11
12#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord, Display)]
13#[serde(tag = "type", content = "value")]
14#[repr(C, u8)]
15pub enum Literal {
16    String(LiteralString),
17    Integer(LiteralInteger),
18    Float(LiteralFloat),
19    True(Keyword),
20    False(Keyword),
21    Null(Keyword),
22}
23
24#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord, Display)]
25#[serde(tag = "type", content = "value")]
26#[repr(C)]
27pub enum LiteralStringKind {
28    SingleQuoted,
29    DoubleQuoted,
30}
31
32#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
33#[repr(C)]
34pub struct LiteralString {
35    pub kind: LiteralStringKind,
36    pub span: Span,
37    pub raw: StringIdentifier,
38    pub value: Option<String>,
39}
40
41#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
42#[repr(C)]
43pub struct LiteralInteger {
44    pub span: Span,
45    pub raw: StringIdentifier,
46    pub value: u64,
47}
48
49#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
50#[repr(C)]
51pub struct LiteralFloat {
52    pub span: Span,
53    pub raw: StringIdentifier,
54    pub value: OrderedFloat<f64>,
55}
56
57impl HasSpan for Literal {
58    fn span(&self) -> Span {
59        match self {
60            Literal::String(value) => value.span(),
61            Literal::Integer(value) => value.span(),
62            Literal::Float(value) => value.span(),
63            Literal::True(value) => value.span(),
64            Literal::False(value) => value.span(),
65            Literal::Null(value) => value.span(),
66        }
67    }
68}
69
70impl HasSpan for LiteralString {
71    fn span(&self) -> Span {
72        self.span
73    }
74}
75
76impl HasSpan for LiteralInteger {
77    fn span(&self) -> Span {
78        self.span
79    }
80}
81
82impl HasSpan for LiteralFloat {
83    fn span(&self) -> Span {
84        self.span
85    }
86}