nvim_api/types/
client_infos.rs1use std::collections::HashMap;
2use std::fmt;
3use std::ops::RangeInclusive;
4
5use serde::{de, Deserialize, Serialize};
6
7#[non_exhaustive]
8#[derive(Clone, Debug, Eq, PartialEq, Deserialize)]
9pub struct ClientInfos {
11 pub attributes: HashMap<String, String>,
16
17 pub methods: HashMap<String, ClientMethod>,
19
20 pub name: String,
22
23 pub r#type: ClientType,
25
26 pub version: ClientVersion,
28}
29
30#[non_exhaustive]
31#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
32pub struct ClientVersion {
33 pub major: Option<u32>,
35
36 pub minor: Option<u32>,
38
39 pub patch: Option<u32>,
41
42 pub prerelease: Option<String>,
44
45 pub commit: Option<String>,
47}
48
49#[non_exhaustive]
50#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
51#[serde(rename_all = "lowercase")]
52pub enum ClientType {
53 Remote,
55
56 Ui,
58
59 Embedder,
62
63 Host,
65
66 Plugin,
68}
69
70#[non_exhaustive]
71#[derive(Clone, Debug, Eq, PartialEq, Hash, Deserialize)]
72pub struct ClientMethod {
73 pub r#async: Option<bool>,
76
77 pub nargs: Option<ClientMethodNArgs>,
81}
82
83#[non_exhaustive]
84#[derive(Clone, Debug, Eq, PartialEq, Hash)]
85pub enum ClientMethodNArgs {
87 Exact(u32),
88 Range(RangeInclusive<u32>),
89}
90
91impl<'de> de::Deserialize<'de> for ClientMethodNArgs {
92 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
93 where
94 D: de::Deserializer<'de>,
95 {
96 struct ClientMethodNArgsVisitor;
97
98 impl<'de> de::Visitor<'de> for ClientMethodNArgsVisitor {
99 type Value = ClientMethodNArgs;
100
101 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
102 f.write_str(
103 "either a single integer or an array of two integers",
104 )
105 }
106
107 fn visit_i64<E>(self, n: i64) -> Result<Self::Value, E>
108 where
109 E: de::Error,
110 {
111 Ok(Self::Value::Exact(n as u32))
112 }
113
114 fn visit_seq<S>(
115 self,
116 mut visitor: S,
117 ) -> Result<Self::Value, S::Error>
118 where
119 S: de::SeqAccess<'de>,
120 {
121 let len = visitor
122 .size_hint()
123 .expect("couldn't determine number of arguments");
124
125 if len != 2 {
126 return Err(de::Error::invalid_length(
127 len,
128 &"was expecting two integers, a minimum and a maximum",
129 ));
130 }
131
132 let min = visitor.next_element::<u32>()?.unwrap();
133 let max = visitor.next_element::<u32>()?.unwrap();
134
135 Ok(Self::Value::Range(RangeInclusive::new(min, max)))
136 }
137 }
138
139 deserializer.deserialize_str(ClientMethodNArgsVisitor)
140 }
141}