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