1use core::fmt;
2
3use serde::{de::value, Deserialize, Serialize};
4
5#[derive(Debug, Copy, Clone, Eq, PartialEq, Deserialize, Serialize)]
6#[serde(rename_all = "camelCase")]
7pub enum Keywords {
8 Package,
9 Client,
10 Server,
11}
12
13#[derive(Debug, Deserialize, Serialize, Clone)]
14pub enum ItemType {
15 NatInt(i64),
16 NatFloat(f64),
17 NatString(String),
18 NatBool(bool),
19 Identifier(String),
20 ClientTypeName(String),
21 ServerTypeName(String),
22 Values(Vec<ItemType>),
23}
24
25impl fmt::Display for ItemType {
26 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27 let errstr = match self {
28 ItemType::NatInt(value) => value.to_string(),
29 ItemType::NatFloat(value) => value.to_string(),
30 ItemType::NatString(value) => format!("\"{}\"", value),
31 ItemType::NatBool(value) => value.to_string(),
32 ItemType::Identifier(value) => value.to_owned(),
33 ItemType::ServerTypeName(value) | ItemType::ClientTypeName(value) => value.to_owned(),
34 ItemType::Values(value) => {
35 format!(
36 "{}]",
37 value
38 .iter()
39 .fold("[".to_owned(), |p, val| format!("{}{},", p, val))
40 )
41 }
42 };
43
44 write!(f, "{}", errstr)
45 }
46}
47
48impl ItemType {
49 pub fn is_int(&self) -> bool {
50 match self {
51 ItemType::NatInt(_) => true,
52 _ => false,
53 }
54 }
55
56 pub fn is_float(&self) -> bool {
57 match self {
58 ItemType::NatFloat(_) => true,
59 _ => false,
60 }
61 }
62
63 pub fn is_string(&self) -> bool {
64 match self {
65 ItemType::NatString(_) => true,
66 _ => false,
67 }
68 }
69
70 pub fn is_boolean(&self) -> bool {
71 match self {
72 ItemType::NatBool(_) => true,
73 _ => false,
74 }
75 }
76
77 pub fn is_client(&self) -> bool {
78 match self {
79 ItemType::ClientTypeName(_) => true,
80 _ => false,
81 }
82 }
83
84 pub fn is_server(&self) -> bool {
85 match self {
86 ItemType::ServerTypeName(_) => true,
87 _ => false,
88 }
89 }
90
91 pub fn is_identifier(&self) -> bool {
92 match self {
93 ItemType::Identifier(_) => true,
94 _ => false,
95 }
96 }
97
98 pub fn is_values(&self) -> bool {
99 match self {
100 ItemType::Values(_) => true,
101 _ => false,
102 }
103 }
104
105 pub fn as_identifier(&self) -> Option<String> {
106 match self {
107 ItemType::Identifier(value) => Some(value.clone()),
108 _ => None,
109 }
110 }
111
112 pub fn as_string_value(&self) -> Option<String> {
113 match self {
114 ItemType::NatString(value) => Some(value.clone()),
115 _ => None,
116 }
117 }
118
119 pub fn as_int_value(&self) -> Option<i64> {
120 match self {
121 ItemType::NatInt(value) => Some(*value),
122 _ => None,
123 }
124 }
125
126 pub fn as_float_value(&self) -> Option<f64> {
127 match self {
128 ItemType::NatFloat(value) => Some(*value),
129 _ => None,
130 }
131 }
132
133 pub fn as_bool_value(&self) -> Option<bool> {
134 match self {
135 ItemType::NatBool(value) => Some(*value),
136 _ => None,
137 }
138 }
139
140 pub fn as_client_name(&self) -> Option<String> {
141 match self {
142 ItemType::ClientTypeName(value) => Some(value.clone()),
143 _ => None,
144 }
145 }
146
147 pub fn as_server_name(&self) -> Option<String> {
148 match self {
149 ItemType::ServerTypeName(value) => Some(value.clone()),
150 _ => None,
151 }
152 }
153
154 pub fn as_values(&self) -> Option<Vec<ItemType>> {
155 match self {
156 ItemType::Values(value) => Some(value.clone()),
157 _ => None,
158 }
159 }
160}
161
162#[derive(Debug, Deserialize, Serialize, Clone)]
163pub enum IdsNode {
164 Package(Box<super::package::Package>),
165 Server(Box<super::server::Server>),
166 Client(Box<super::client::Client>),
167}