use nvim_types::{
conversion::{self, FromObject},
serde::Deserializer,
Function,
Object,
};
use serde::{
de::{self, Error},
Deserialize,
};
use super::{CommandAddr, CommandArgs, CommandNArgs, CommandRange};
#[non_exhaustive]
#[derive(Clone, Debug, Eq, PartialEq, Hash, Deserialize)]
pub struct CommandInfos {
pub addr: Option<CommandAddr>,
pub bang: bool,
pub bar: bool,
pub callback: Option<Function<CommandArgs, ()>>,
pub complete: Option<String>,
pub complete_arg: Option<String>,
#[serde(deserialize_with = "parse_count")]
pub count: Option<u32>,
pub definition: Option<String>,
pub keepscript: bool,
pub name: String,
#[serde(default)]
pub nargs: CommandNArgs,
pub range: Option<CommandRange>,
pub register: bool,
pub script_id: i32,
}
fn parse_count<'de, D>(deserializer: D) -> Result<Option<u32>, D::Error>
where
D: de::Deserializer<'de>,
{
Option::<String>::deserialize(deserializer)?
.map(|count| {
count.parse().map_err(|err: std::num::ParseIntError| {
D::Error::custom(err.to_string())
})
})
.transpose()
}
impl FromObject for CommandInfos {
fn from_object(obj: Object) -> Result<Self, conversion::Error> {
Self::deserialize(Deserializer::new(obj)).map_err(Into::into)
}
}