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