nui 0.0.1

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

use super::*;

#[derive(Debug)]
pub enum Redraw {
    SetTitle(String),
    SetIcon(String),
    Mouse(bool),
    Busy(bool),
    Bell,
    VisualBell,
    OptionSet(OptionSet),
    ModeChange(ModeChange),
    Flush,
    HighlightAttributeDefine(HighlightAttributeDefine),
    HighlightGroupSet(HighlightGroupSet),
    GridLine(GridLine),
    GridResize(GridResize),
    GridClear(GridClear),
    GridDestroy(GridDestroy),
    WindowViewport(WindowViewport),
    PopupMenuShow(PopupMenuShow),
    PopupMenuSelect(PopupMenuSelect),
    PopupMenuHide,
    CmdLineHide,
    CmdLineBlockShow(CmdLineBlockShow),
    CmdLineBlockAppend(CmdLineBlockAppend),
    CmdLineBlockHide,
    MessageShow(MessageShow),
    MessageHide,
    MessageShowMode(MessageShowMode),
    MessageShowCmd(MessageShowCmd),
    MessageRuler(MessageRuler),
    MessageHistoryShow(MessageHistoryShow),
}

impl Redraw {
    fn parse_event(name: &str, params: &Vec<Value>) -> Result<Option<Redraw>, ParseError> {
        match name {
            "set_title" => Ok(None),
            "set_icon" => Ok(None),
            "mode_info_set" => Ok(None),
            "option_set" => Ok(Some(Redraw::OptionSet(OptionSet::try_from(params)?))),
            "mode_change" => Ok(Some(Redraw::ModeChange(ModeChange::try_from(params)?))),
            "mouse_on" => Ok(Some(Redraw::Mouse(true))),
            "mouse_off" => Ok(Some(Redraw::Mouse(false))),
            "busy_start" => Ok(Some(Redraw::Busy(false))),
            "busy_stop" => Ok(Some(Redraw::Busy(false))),
            "suspend" => Ok(None),
            "update_menu" => Ok(None),
            "bell" => Ok(Some(Redraw::Bell)),
            "visual_bell" => Ok(Some(Redraw::VisualBell)),
            "flush" => Ok(Some(Redraw::Flush)),

            "default_colors_set" => Ok(None),
            "hl_attr_define" => Ok(Some(Redraw::HighlightAttributeDefine(
                HighlightAttributeDefine::try_from(params)?,
            ))),
            "hl_group_set" => Ok(Some(Redraw::HighlightGroupSet(
                HighlightGroupSet::try_from(params)?,
            ))),
            "grid_line" => Ok(Some(Redraw::GridLine(GridLine::try_from(params)?))),
            "grid_resize" => Ok(None),
            "grid_clear" => Ok(None),
            "grid_destroy" => Ok(None),
            "grid_cursor_goto" => Ok(None),
            "grid_scroll" => Ok(None),
            "win_pos" => Ok(None),
            "win_float_pos" => Ok(None),
            "win_external_pos" => Ok(None),
            "win_hide" => Ok(None),
            "win_close" => Ok(None),
            "win_viewport" => Ok(Some(Redraw::WindowViewport(WindowViewport::try_from(
                params,
            )?))),
            "win_extmark" => Ok(None),
            "msg_set_pos" => Ok(None),

            "popupmenu_show" => Ok(None),
            "popupmenu_select" => Ok(None),
            "popupmenu_hide" => Ok(None),

            "tabline_update" => Ok(None),

            "cmdline_show" => Ok(None),
            "cmdline_hide" => Ok(None),
            "cmdline_pos" => Ok(None),
            "cmdline_special_char" => Ok(None),
            "cmdline_block_show" => Ok(None),
            "cmdline_block_hide" => Ok(None),
            "cmdline_block_append" => Ok(None),

            "msg_show" => Ok(None),
            "msg_clear" => Ok(None),
            "msg_showmode" => Ok(None),
            "msg_showcmd" => Ok(None),
            "msg_ruler" => Ok(None),
            "msg_history_show" => Ok(None),
            "msg_history_clear" => Ok(None),

            _ => {
                eprintln!("Redraw event not implemented: {:?}", name);
                Ok(None)
            }
        }
    }

    pub fn parse(value: Value) -> Option<Vec<Redraw>> {
        let values = value.as_array().unwrap();
        let mut events = Vec::<Redraw>::with_capacity(values.len());

        for event in values.into_iter() {
            let mut iter = event.as_array().unwrap().into_iter();
            let name = iter.next().unwrap().as_str().unwrap();
            let params = iter.next().unwrap().as_array().unwrap();

            if let Ok(Some(e)) = Redraw::parse_event(name, params) {
                events.push(e)
            };
        }

        Some(events)
    }
}