Skip to main content

mago_type_syntax/ast/
literal.rs

1use ordered_float::OrderedFloat;
2use serde::Serialize;
3
4use mago_span::HasSpan;
5use mago_span::Span;
6
7#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
8pub struct LiteralIntType<'input> {
9    pub span: Span,
10    pub value: u64,
11    pub raw: &'input str,
12}
13
14#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
15pub struct LiteralFloatType<'input> {
16    pub span: Span,
17    pub value: OrderedFloat<f64>,
18    pub raw: &'input str,
19}
20
21#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
22pub enum LiteralIntOrFloatType<'input> {
23    Int(LiteralIntType<'input>),
24    Float(LiteralFloatType<'input>),
25}
26
27#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
28pub struct LiteralStringType<'input> {
29    pub span: Span,
30    pub value: &'input str, // unquoted
31    pub raw: &'input str,
32}
33
34impl HasSpan for LiteralFloatType<'_> {
35    fn span(&self) -> Span {
36        self.span
37    }
38}
39
40impl HasSpan for LiteralIntType<'_> {
41    fn span(&self) -> Span {
42        self.span
43    }
44}
45
46impl HasSpan for LiteralIntOrFloatType<'_> {
47    fn span(&self) -> Span {
48        match self {
49            LiteralIntOrFloatType::Int(int) => int.span(),
50            LiteralIntOrFloatType::Float(float) => float.span(),
51        }
52    }
53}
54
55impl HasSpan for LiteralStringType<'_> {
56    fn span(&self) -> Span {
57        self.span
58    }
59}
60
61impl std::fmt::Display for LiteralIntType<'_> {
62    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
63        write!(f, "{}", self.raw)
64    }
65}
66
67impl std::fmt::Display for LiteralFloatType<'_> {
68    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69        write!(f, "{}", self.raw)
70    }
71}
72
73impl std::fmt::Display for LiteralIntOrFloatType<'_> {
74    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
75        match self {
76            LiteralIntOrFloatType::Int(int) => write!(f, "{int}"),
77            LiteralIntOrFloatType::Float(float) => write!(f, "{float}"),
78        }
79    }
80}
81
82impl std::fmt::Display for LiteralStringType<'_> {
83    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84        write!(f, "{}", self.raw)
85    }
86}