mago_syntax/ast/ast/
literal.rs1use 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}