nui 0.0.1

Experimental neovim RPC for UI clients
Documentation
use rmpv::Value;

use crate::{Message, Neovim};

pub struct AttachOptions {
    rgb: Option<bool>,
    ui_override: Option<bool>,
    ext_cmdline: Option<bool>,
    ext_hlstate: Option<bool>,
    ext_linegrid: Option<bool>,
    ext_messages: Option<bool>,
    ext_multigrid: Option<bool>,
    ext_popupmenu: Option<bool>,
    ext_tabline: Option<bool>,
    ext_termcolors: Option<bool>,
    term_name: Option<String>,
    term_colors: Option<u16>,
    term_background: Option<String>,
}

impl Default for AttachOptions {
    fn default() -> Self {
        Self {
            rgb: Some(true),
            ui_override: Some(true),
            ext_cmdline: Some(true),
            ext_hlstate: Some(true),
            ext_linegrid: Some(true),
            ext_messages: Some(true),
            ext_multigrid: Some(true),
            ext_popupmenu: Some(true),
            ext_tabline: Some(true),
            ext_termcolors: Some(true),
            term_name: None,
            term_colors: None,
            term_background: None,
        }
    }
}

impl AttachOptions {
    pub fn new() -> Self {
        Self {
            rgb: None,
            ui_override: None,
            ext_cmdline: None,
            ext_hlstate: None,
            ext_linegrid: None,
            ext_messages: None,
            ext_multigrid: None,
            ext_popupmenu: None,
            ext_tabline: None,
            ext_termcolors: None,
            term_name: None,
            term_colors: None,
            term_background: None,
        }
    }

    #[must_use]
    pub fn build(self) -> Value {
        let mut options: Vec<(Value, Value)> = vec![];

        if let Some(value) = self.rgb {
            options.push((Value::from("rgb"), Value::from(value)));
        }

        if let Some(value) = self.ui_override {
            options.push((Value::from("override"), Value::from(value)));
        }

        if let Some(value) = self.ext_cmdline {
            options.push((Value::from("ext_cmdline"), Value::from(value)));
        }

        if let Some(value) = self.ext_hlstate {
            options.push((Value::from("ext_hlstate"), Value::from(value)));
        }

        if let Some(value) = self.ext_linegrid {
            options.push((Value::from("ext_linegrid"), Value::from(value)));
        }

        if let Some(value) = self.ext_messages {
            options.push((Value::from("ext_messages"), Value::from(value)));
        }

        if let Some(value) = self.ext_multigrid {
            options.push((Value::from("ext_multigrid"), Value::from(value)));
        }

        if let Some(value) = self.ext_popupmenu {
            options.push((Value::from("ext_popupmenu"), Value::from(value)));
        }

        if let Some(value) = self.ext_tabline {
            options.push((Value::from("ext_tabline"), Value::from(value)));
        }

        if let Some(value) = self.ext_termcolors {
            options.push((Value::from("ext_termcolors"), Value::from(value)));
        }

        if let Some(value) = self.term_name {
            options.push((Value::from("term_name"), Value::from(value)));
        }

        if let Some(value) = self.term_colors {
            options.push((Value::from("term_colors"), Value::from(value)));
        }

        if let Some(value) = self.term_background {
            options.push((Value::from("term_background"), Value::from(value)));
        }

        Value::Map(options)
    }
}

impl Neovim {
    pub async fn attach(
        &self,
        width: u16,
        height: u16,
        options: Value,
    ) -> Result<Message, crate::neovim::Error> {
        self.request(
            "nvim_ui_attach".to_owned(),
            vec![Value::from(width), Value::from(height), options],
        )
        .await
    }
}