nvim_api/types/
command_range.rs1use std::fmt;
2
3use nvim_types::{
4 conversion::{self, ToObject},
5 serde::Serializer,
6 Object,
7};
8use serde::{de, ser, Serialize};
9
10#[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}