serde_lsp/dap/
variables_arguments.rs1use super::*;
2use crate::dap::VariableFilter;
3use serde::{
4 de::{Error, MapAccess, Visitor},
5 Deserializer,
6 __private::de::Content,
7};
8use std::{fmt::Formatter, num::NonZeroUsize};
9
10#[derive(Clone, Debug, Serialize)]
11#[serde(rename_all = "camelCase")]
12pub struct VariablesArguments {
13 pub variables_reference: NonZeroUsize,
17 pub filter: Option<VariableFilter>,
21 pub start: usize,
25 pub count: Option<NonZeroUsize>,
30 pub format: ValueFormat,
34}
35
36impl<'de> Deserialize<'de> for VariablesArguments {
37 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
38 where
39 D: Deserializer<'de>,
40 {
41 deserializer.deserialize_map(VariablesArgumentsVisitor::default())
42 }
43}
44
45#[derive(Default)]
46struct VariablesArgumentsVisitor {
47 variables_reference: Option<NonZeroUsize>,
48 filter: Option<VariableFilter>,
49 start: usize,
50 count: Option<NonZeroUsize>,
51}
52
53impl<'de> Visitor<'de> for VariablesArgumentsVisitor {
54 type Value = VariablesArguments;
55
56 fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
57 formatter.write_str("InspectVariableRequest")
58 }
59 fn visit_map<A>(mut self, mut map: A) -> Result<Self::Value, A::Error>
60 where
61 A: MapAccess<'de>,
62 {
63 while let Some(key) = map.next_key::<String>()? {
64 match key.as_str() {
65 "variablesReference" => self.variables_reference = Some(map.next_value()?),
66 "filter" => self.filter = Some(map.next_value()?),
67 "start" => self.start = map.next_value()?,
68 "count" => {
69 let value = map.next_value::<usize>()?;
70 self.count = NonZeroUsize::new(value)
71 }
72 _ => {
73 let value = map.next_value::<Content>()?;
74 println!("Unknown key {:?}, value {:#?}", key, value)
75 }
76 }
77 }
78 if self.variables_reference.is_none() {
79 return Err(Error::missing_field("variablesReference"));
80 }
81 Ok(VariablesArguments {
82 variables_reference: self.variables_reference.unwrap(),
83 filter: self.filter,
84 start: self.start,
85 count: self.count,
86 format: Default::default(),
87 })
88 }
89}