nvim_api/types/
command_range.rs

1use std::fmt;
2
3use nvim_types::{
4    conversion::{self, ToObject},
5    serde::Serializer,
6    Object,
7};
8use serde::{de, ser, Serialize};
9
10// use crate::object::{self, ToObject};
11
12/// See `:h command-range` for details.
13#[non_exhaustive]
14#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Serialize)]
15pub enum CommandRange {
16    #[serde(serialize_with = "serialize_as_true")]
17    CurrentLine,
18
19    #[serde(rename = "%")]
20    WholeFile,
21
22    Count(u32),
23}
24
25impl ToObject for CommandRange {
26    fn to_object(self) -> Result<Object, conversion::Error> {
27        self.serialize(Serializer::new()).map_err(Into::into)
28    }
29}
30
31impl<'de> de::Deserialize<'de> for CommandRange {
32    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
33    where
34        D: de::Deserializer<'de>,
35    {
36        struct CommandRangeVisitor;
37
38        impl<'de> de::Visitor<'de> for CommandRangeVisitor {
39            type Value = CommandRange;
40
41            fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
42                f.write_str("\".\", \"%\" or an integer")
43            }
44
45            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
46            where
47                E: de::Error,
48            {
49                match v {
50                    "." => return Ok(Self::Value::CurrentLine),
51                    "%" => return Ok(Self::Value::WholeFile),
52
53                    other => {
54                        if let Ok(n) = other.parse::<u32>() {
55                            return Ok(Self::Value::Count(n));
56                        }
57                    },
58                };
59
60                Err(E::invalid_value(
61                    de::Unexpected::Str(v),
62                    &"\".\", \"%\" or an integer",
63                ))
64            }
65        }
66
67        deserializer.deserialize_str(CommandRangeVisitor)
68    }
69}
70
71fn serialize_as_true<S>(serializer: S) -> Result<S::Ok, S::Error>
72where
73    S: ser::Serializer,
74{
75    serializer.serialize_bool(true)
76}