|
@@ -1,9 +1,5 @@
|
|
|
use crate::types;
|
|
|
-use serde::{
|
|
|
- de::{self, Deserializer},
|
|
|
- ser::{self, SerializeSeq, Serializer},
|
|
|
- Deserialize, Serialize,
|
|
|
-};
|
|
|
+use serde::ser::{self, SerializeSeq, Serializer};
|
|
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
|
pub struct Request {
|
|
@@ -11,84 +7,6 @@ pub struct Request {
|
|
|
pub filters: Vec<types::Filter>,
|
|
|
}
|
|
|
|
|
|
-impl<'de> de::Deserialize<'de> for Request {
|
|
|
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
|
- where
|
|
|
- D: Deserializer<'de>,
|
|
|
- {
|
|
|
- #[derive(Deserialize, Serialize, Debug)]
|
|
|
- #[serde(untagged)]
|
|
|
- enum StringOrFilter {
|
|
|
- Filter(types::Filter),
|
|
|
- String(String),
|
|
|
- }
|
|
|
-
|
|
|
- impl<'de> StringOrFilter {
|
|
|
- pub fn to_filter<D>(&self, element: usize) -> Result<types::Filter, D::Error>
|
|
|
- where
|
|
|
- D: Deserializer<'de>,
|
|
|
- {
|
|
|
- match self {
|
|
|
- Self::Filter(f) => Ok(f.clone()),
|
|
|
- _ => Err(de::Error::custom(format!(
|
|
|
- "Expecting a filter in element {}, got a filter object",
|
|
|
- element,
|
|
|
- ))),
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- pub fn to_string<D>(&self, element: usize) -> Result<String, D::Error>
|
|
|
- where
|
|
|
- D: Deserializer<'de>,
|
|
|
- {
|
|
|
- match self {
|
|
|
- Self::String(string) => Ok(string.to_owned()),
|
|
|
- _ => Err(de::Error::custom(format!(
|
|
|
- "Expecting an string in element {}, got a filter object",
|
|
|
- element,
|
|
|
- ))),
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- let s: Vec<StringOrFilter> = Deserialize::deserialize(deserializer)?;
|
|
|
- if s.len() < 2 {
|
|
|
- return Err(de::Error::custom(
|
|
|
- "Array too small, it must have at least 2 elements",
|
|
|
- ));
|
|
|
- }
|
|
|
- let header = s[0].to_string::<D>(0)?;
|
|
|
- let subscription_id = s[1]
|
|
|
- .to_string::<D>(1)?
|
|
|
- .as_str()
|
|
|
- .try_into()
|
|
|
- .map_err(|e: types::subscription_id::Error| de::Error::custom(e.to_string()))?;
|
|
|
-
|
|
|
- if header != "REQ" {
|
|
|
- return Err(de::Error::custom(format!(
|
|
|
- "Invalid header, got {} and expected REQ",
|
|
|
- header
|
|
|
- )));
|
|
|
- }
|
|
|
-
|
|
|
- let mut index = 1;
|
|
|
- Ok(Request {
|
|
|
- subscription_id,
|
|
|
- filters: if s.len() > 2 {
|
|
|
- s[2..]
|
|
|
- .iter()
|
|
|
- .map(|filter| {
|
|
|
- index += 1;
|
|
|
- filter.to_filter::<D>(index)
|
|
|
- })
|
|
|
- .collect::<Result<Vec<types::Filter>, D::Error>>()?
|
|
|
- } else {
|
|
|
- vec![]
|
|
|
- },
|
|
|
- })
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
impl ser::Serialize for Request {
|
|
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
|
where
|
|
@@ -107,6 +25,7 @@ impl ser::Serialize for Request {
|
|
|
#[cfg(test)]
|
|
|
mod test {
|
|
|
use super::*;
|
|
|
+ use crate::Message;
|
|
|
use chrono::Utc;
|
|
|
|
|
|
#[test]
|
|
@@ -132,7 +51,8 @@ mod test {
|
|
|
};
|
|
|
|
|
|
let serialized = serde_json::to_string(&r).expect("valid json string");
|
|
|
- let obj: Request = serde_json::from_str(&serialized).expect("valid request");
|
|
|
+ let obj: Message = serde_json::from_str(&serialized).expect("valid request");
|
|
|
+ let obj = obj.get_request().expect("request");
|
|
|
assert_eq!(r.subscription_id, obj.subscription_id);
|
|
|
assert_eq!(r.filters.len(), obj.filters.len());
|
|
|
}
|