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
}
}