serde_lsp/dap/
request.rs

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}