rs_flow/package/
package.rs1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::{error::PackageError,
6 serde::{deserialize, serialize, PackageDeserializerError, PackageSerializerError}
7};
8
9
10#[derive(Debug, Clone, Serialize, Deserialize, Default)]
11#[serde(untagged)]
12pub enum Package {
13 #[default]
14 Empty,
15 Number(f64),
16 String(String),
17 Boolean(bool),
18 Bytes(Vec<u8>),
19 Array(Vec<Package>),
20 Object(HashMap<String, Package>)
21}
22
23impl Package {
24 pub fn try_from<T: Serialize>(content: T) -> Result<Self, PackageSerializerError> {
46 serialize(content)
47 }
48 pub fn try_into<T: for<'a> Deserialize<'a>>(self) ->
73 Result<T, PackageDeserializerError>
74 {
75 deserialize(self)
76 }
77
78 pub fn empty() -> Self {
80 Package::Empty
81 }
82 pub fn number(value: f64) -> Self {
84 value.into()
85 }
86 pub fn bool(value: bool) -> Self {
88 value.into()
89 }
90 pub fn string(value: &str) -> Self {
92 value.into()
93 }
94 pub fn bytes(value: &[u8]) -> Self {
96 value.into()
97 }
98 pub fn array<T: Into<Package>>(value: impl IntoIterator<Item = T>) -> Self {
100 Self::Array(value.into_iter().map(Into::into).collect())
101 }
102 pub fn object<T: Into<Package>, K: Into<String>>(value: impl IntoIterator<Item = (K, T)>) -> Self {
105 Self::Object(value.into_iter().map(|(k,v)| (k.into(), v.into())).collect())
106 }
107
108
109 pub fn is_empty(&self) -> bool {
111 match self {
112 Package::Empty => true,
113 _ => false
114 }
115 }
116 pub fn is_number(&self) -> bool {
118 match self {
119 Package::Number(_) => true,
120 _ => false
121 }
122 }
123 pub fn is_bool(&self) -> bool {
125 match self {
126 Package::Boolean(_) => true,
127 _ => false
128 }
129 }
130 pub fn is_string(&self) -> bool {
132 match self {
133 Package::String(_) => true,
134 _ => false
135 }
136 }
137 pub fn is_bytes(&self) -> bool {
139 match self {
140 Package::Bytes(_) => true,
141 _ => false
142 }
143 }
144 pub fn is_array(&self) -> bool {
146 match self {
147 Package::Array(_) => true,
148 _ => false
149 }
150 }
151 pub fn is_object(&self) -> bool {
153 match self {
154 Package::Object(_) => true,
155 _ => false
156 }
157 }
158
159
160 pub fn get_empty(self) -> Result<(), PackageError> {
162 match self {
163 Package::Empty => Ok(()),
164 _ => Err(PackageError::NotEmpty)
165 }
166 }
167 pub fn get_number(self) -> Result<f64, PackageError> {
169 match self {
170 Package::Number(number) => Ok(number),
171 _ => Err(PackageError::NotNumber)
172 }
173 }
174 pub fn get_string(self) -> Result<String, PackageError> {
176 match self {
177 Package::String(string) => Ok(string),
178 _ => Err(PackageError::NotString)
179 }
180 }
181 pub fn get_bool(self) -> Result<bool, PackageError> {
183 match self {
184 Package::Boolean(bool) => Ok(bool),
185 _ => Err(PackageError::NotBoolean)
186 }
187 }
188 pub fn get_bytes(self) -> Result<Vec<u8>, PackageError> {
190 match self {
191 Package::Bytes(bytes) => Ok(bytes),
192 _ => Err(PackageError::NotBytes)
193 }
194 }
195 pub fn get_array(self) -> Result<Vec<Package>, PackageError> {
197 match self {
198 Package::Array(array) => Ok(array),
199 _ => Err(PackageError::NotArray)
200 }
201 }
202 pub fn get_object(self) -> Result<HashMap<String, Package>, PackageError> {
204 match self {
205 Package::Object(object) => Ok(object),
206 _ => Err(PackageError::NotObject)
207 }
208 }
209
210}
211
212
213
214macro_rules! impl_from_number {
216 ($($ty: ty),+) => {
217 $(
218 impl From<$ty> for Package {
219 fn from(value: $ty) -> Self {
220 Package::Number(value as f64)
221 }
222 }
223 )+
224 };
225}
226impl_from_number!(u8, u16, u32, u64, usize);
227impl_from_number!(i8, i16, i32, i64, isize);
228impl_from_number!(f32, f64);
229
230impl From<bool> for Package {
232 fn from(value: bool) -> Self {
233 Package::Boolean(value)
234 }
235}
236
237
238impl From<String> for Package {
240 fn from(value: String) -> Self {
241 Package::String(value)
242 }
243}
244impl From<&str> for Package {
245 fn from(value: &str) -> Self {
246 Package::String(value.to_owned())
247 }
248}
249
250impl From<Vec<u8>> for Package {
252 fn from(value: Vec<u8>) -> Self {
253 Package::Bytes(value)
254 }
255}
256impl From<&[u8]> for Package {
257 fn from(value: &[u8]) -> Self {
258 Package::Bytes(value.into())
259 }
260}
261impl<const C: usize> From<[u8; C]> for Package {
262 fn from(value: [u8; C]) -> Self {
263 Package::Bytes(value.into())
264 }
265}