nvim-api 0.2.0

Neovim API bindings
Documentation
use nvim_types::{self as nvim, conversion::FromObject, serde::Serializer};
use serde::{ser, Serialize};

#[non_exhaustive]
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize)]
pub enum RegisterType {
    #[serde(serialize_with = "serialize_blockwise")]
    BlockwiseVisual(Option<usize>),

    #[serde(rename = "c")]
    Charwise,

    #[serde(rename = "l")]
    Linewise,

    #[serde(rename = "")]
    Guess,
}

fn serialize_blockwise<S>(
    width: &Option<usize>,
    serializer: S,
) -> Result<S::Ok, S::Error>
where
    S: ser::Serializer,
{
    serializer.serialize_str(
        &(match width {
            Some(n) => format!("b{n}"),
            None => "b".to_owned(),
        }),
    )
}

impl From<RegisterType> for nvim::String {
    fn from(reg_type: RegisterType) -> Self {
        nvim::String::from_object(
            reg_type
                .serialize(Serializer::new())
                .expect("`RegisterType` is serializable"),
        )
        .expect("`RegisterType` is serialized into a string")
    }
}