forester_rs/tree/parser/ast/
message.rs1use crate::tree::parser::ast::arg::MesType;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4use std::fmt::{Display, Formatter};
5
6#[derive(Debug, Copy, Clone, PartialEq, Deserialize, Serialize)]
8pub enum Number {
9 Int(i64),
10 Float(f64),
11 Hex(i64),
12 Binary(isize),
13}
14
15#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
17pub struct StringLit(pub String);
18
19#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
21pub enum Bool {
22 True,
23 False,
24}
25
26impl Into<bool> for Bool {
27 fn into(self) -> bool {
28 match self {
29 Bool::True => true,
30 Bool::False => false,
31 }
32 }
33}
34
35#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
37pub enum Message {
38 Num(Number),
39 String(StringLit),
40 Bool(Bool),
41 Array(Vec<Message>),
42 Object(HashMap<String, Message>),
43}
44
45impl Display for Message {
46 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
47 match self {
48 Message::Num(v) => match v {
49 Number::Int(v) => write!(f, "{}", v),
50 Number::Float(v) => write!(f, "{}", v),
51 Number::Hex(v) => write!(f, "{}", v),
52 Number::Binary(v) => write!(f, "{}", v),
53 },
54 Message::String(v) => write!(f, "{}", v.0),
55 Message::Bool(b) => match b {
56 Bool::True => write!(f, "true"),
57 Bool::False => write!(f, "false"),
58 },
59 Message::Array(array) => {
60 let mut list = f.debug_list();
61 let strings: Vec<_> = array.iter().map(|v| format!("{}", v)).collect();
62 list.entries(strings);
63 list.finish()
64 }
65 Message::Object(obj) => {
66 let mut map = f.debug_map();
67 let entries: Vec<_> = obj.iter().map(|(k, v)| (k, format!("{}", v))).collect();
68 map.entries(entries);
69 map.finish()
70 }
71 }
72 }
73}
74
75impl Message {
76 pub fn same(&self, mt: &MesType) -> bool {
77 matches!(
78 (&self, mt),
79 (Message::Num(_), MesType::Num)
80 | (Message::String(_), MesType::String)
81 | (Message::Bool(_), MesType::Bool)
82 | (Message::Array(_), MesType::Array)
83 | (Message::Object(_), MesType::Object))
84 || matches!(mt, MesType::Any)
85 }
86
87 pub fn str(v: &str) -> Self {
88 Message::String(StringLit(v.to_string()))
89 }
90 pub fn bool(v: bool) -> Self {
91 if v {
92 Message::Bool(Bool::True)
93 } else {
94 Message::Bool(Bool::False)
95 }
96 }
97 pub fn int(v: i64) -> Self {
98 Message::Num(Number::Int(v))
99 }
100 pub fn float(v: f64) -> Self {
101 Message::Num(Number::Float(v))
102 }
103 pub fn object(pairs: Vec<(String, Message)>) -> Self {
104 Message::Object(HashMap::from_iter(pairs))
105 }
106 pub fn array(elems: Vec<Message>) -> Self {
107 Message::Array(elems)
108 }
109}