use std::result; use super::client::NeovimRef; use neovim_lib::{NeovimApi, CallError}; pub trait ErrorReport { fn report_err(&self, nvim: &mut NeovimApi); fn ok_and_report(self, nvim: &mut NeovimApi) -> Option; } impl ErrorReport for result::Result { fn report_err(&self, _: &mut NeovimApi) { if let Err(ref err) = *self { error!("{}", err); //nvim.report_error(&err_msg).expect("Error report error :)"); } } fn ok_and_report(self, nvim: &mut NeovimApi) -> Option { self.report_err(nvim); self.ok() } } pub trait NeovimExt: Sized { fn non_blocked(self) -> Option; } impl <'a>NeovimExt for NeovimRef<'a> { fn non_blocked(mut self) -> Option { self.get_mode().ok_and_report(&mut *self).and_then(|mode| { mode.iter() .find(|kv| { kv.0.as_str().map(|key| key == "blocking").unwrap_or(false) }) .map(|kv| kv.1.as_bool().unwrap_or(false)) .and_then(|block| if block { None } else { Some(self) }) }) } }