1use super::*;
2use serde::{
3 de::{DeserializeOwned, MapAccess, Visitor},
4 Deserializer,
5};
6use serde_json::{Error, Value};
7use std::fmt::Formatter;
8
9#[derive(Clone, Debug)]
10pub struct Request {
11 pub sequence: usize,
12 pub command: String,
13 pub arguments: Value,
14}
15
16impl Request {
17 pub fn recast<T>(&self) -> Result<T, Error>
18 where
19 T: DeserializeOwned,
20 {
21 serde_json::from_value(self.arguments.clone())
22 }
23}
24
25#[derive(Default)]
26pub struct RequestVisitor {
27 pub sequence: usize,
28 pub command: String,
29 pub arguments: Value,
30}
31
32impl<'de> Deserialize<'de> for Request {
33 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
34 where
35 D: Deserializer<'de>,
36 {
37 deserializer.deserialize_map(RequestVisitor::default())
38 }
39}
40
41impl<'i, 'de> Visitor<'de> for RequestVisitor {
42 type Value = Request;
43
44 fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
45 formatter.write_str("a request map")
46 }
47 fn visit_map<A>(mut self, mut map: A) -> Result<Self::Value, A::Error>
48 where
49 A: MapAccess<'de>,
50 {
51 while let Some(key) = map.next_key::<String>()? {
52 match key.as_str() {
53 "command" => self.command = map.next_value()?,
54 "seq" => self.sequence = map.next_value()?,
55 "type" => {
56 let _type = map.next_value::<String>()?;
57 debug_assert_eq!(_type, "request")
58 }
59 "arguments" => self.arguments = map.next_value()?,
60 _ => {
61 eprintln!("Unknown key in request: {}", key)
62 }
63 }
64 }
65 Ok(Request { sequence: self.sequence, command: self.command, arguments: self.arguments })
66 }
67}