nvim_api/types/
cmd_range.rs1use std::fmt;
2
3use nvim_types::{Array, Integer, Object};
4use serde::de;
5
6#[non_exhaustive]
7#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
8pub enum CmdRange {
9 None,
10 Single(usize),
11 Double(usize, usize),
12}
13
14impl<'de> de::Deserialize<'de> for CmdRange {
15 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
16 where
17 D: de::Deserializer<'de>,
18 {
19 struct CmdRangeVisitor;
20
21 impl<'de> de::Visitor<'de> for CmdRangeVisitor {
22 type Value = CmdRange;
23
24 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
25 f.write_str("an array with 0, 1 or 2 numbers")
26 }
27
28 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
29 where
30 A: de::SeqAccess<'de>,
31 {
32 match seq.size_hint().ok_or_else(|| {
33 de::Error::custom("couldn't determine array length")
34 })? {
35 0 => Ok(Self::Value::None),
36 1 => {
37 let a = seq.next_element::<usize>()?.unwrap();
38 Ok(Self::Value::Single(a))
39 },
40 2 => {
41 let a = seq.next_element::<usize>()?.unwrap();
42 let b = seq.next_element::<usize>()?.unwrap();
43 Ok(Self::Value::Double(a, b))
44 },
45 num => Err(de::Error::invalid_length(
46 num,
47 &"an array with 0, 1 or 2 numbers",
48 )),
49 }
50 }
51 }
52
53 deserializer.deserialize_seq(CmdRangeVisitor)
54 }
55}
56
57impl From<CmdRange> for Object {
58 fn from(rng: CmdRange) -> Self {
59 use CmdRange::*;
60
61 match rng {
62 None => Array::new(),
63 Single(a) => Array::from_iter([a as Integer]),
64 Double(a, b) => Array::from_iter([a as Integer, b as Integer]),
65 }
66 .into()
67 }
68}