forester_rs/tree/parser/ast/
message.rs

1use crate::tree::parser::ast::arg::MesType;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4use std::fmt::{Display, Formatter};
5
6/// A gathering structure for numeric scalar values
7#[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/// A gathering structure for string scalar values
16#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
17pub struct StringLit(pub String);
18
19/// A gathering structure for boolean scalar values
20#[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/// A gathering structure for scalar values
36#[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}