nvim_api/types/
cmd_range.rs

1use 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}