use log::{debug, error};
use std::collections::HashMap;
use std::fmt;
use std::sync::mpsc::{channel, Receiver, Sender};
use std::sync::Arc;
use async_trait::async_trait;
use futures::future::Future;
use nvim_rs::{create::Spawner, neovim::Neovim, Handler};
use rmpv::Value;
use crate::nvim_gio::GioWriter;
use crate::thread_guard::ThreadGuard;
use crate::ui::color::{Color, Highlight};
#[cfg(test)]
mod tests;
macro_rules! unwrap_str {
($val:expr) => {
$val.as_str().unwrap();
};
}
macro_rules! unwrap_u64 {
($val:expr) => {
$val.as_u64().unwrap();
};
}
macro_rules! unwrap_i64 {
($val:expr) => {
$val.as_i64().unwrap();
};
}
macro_rules! unwrap_f64 {
($val:expr) => {
$val.as_f64().unwrap();
};
}
macro_rules! unwrap_array {
($val:expr) => {
$val.as_array().unwrap();
};
}
macro_rules! unwrap_map {
($val:expr) => {
$val.as_map().unwrap();
};
}
macro_rules! unwrap_bool {
($val:expr) => {
$val.as_bool().unwrap();
};
}
macro_rules! try_str {
($val:expr, $msg:expr) => {
$val.as_str()
.ok_or(format!("Value is not an str: {}", $msg))?
};
}
macro_rules! try_u64 {
($val:expr, $msg:expr) => {
$val.as_u64()
.ok_or(format!("Value is not an u64: {}", $msg))?
};
}
impl Highlight {
fn from_map_val(map: &Vec<(Value, Value)>) -> Self {
let mut hl = Highlight::default();
for (prop, val) in map {
hl.set(unwrap_str!(prop), val.clone());
}
hl
}
fn set(&mut self, prop: &str, val: Value) {
match prop {
"foreground" => {
self.foreground = if let Some(val) =