use std::io;
use cursive::backends::crossterm;
use cursive::theme::{Color, PaletteColor};
use cursive::{Cursive, CursiveRunnable, CursiveRunner};
use cursive_buffered_backend::BufferedBackend;
use lib::core::effects::Effects;
pub fn with_siv<T, F: FnOnce(Effects, CursiveRunner<CursiveRunnable>) -> eyre::Result<T>>(
effects: &Effects,
f: F,
) -> eyre::Result<T> {
let mut siv = CursiveRunnable::new(|| -> io::Result<_> {
let crossterm_backend = crossterm::Backend::init()?;
Ok(Box::new(BufferedBackend::new(crossterm_backend)))
});
siv.update_theme(|theme| {
theme.shadow = false;
theme.palette.extend(vec![
(PaletteColor::Background, Color::TerminalDefault),
(PaletteColor::View, Color::TerminalDefault),
(PaletteColor::Primary, Color::TerminalDefault),
(PaletteColor::TitlePrimary, Color::TerminalDefault),
(PaletteColor::TitleSecondary, Color::TerminalDefault),
]);
});
let effects = effects.enable_tui_mode();
f(effects, siv.into_runner())
}
pub trait SingletonView<V> {
fn find(siv: &mut Cursive) -> cursive::views::ViewRef<V>;
}
#[macro_export]
macro_rules! declare_views {
{ $( $k:ident => $v:ty ),* $(,)? } => {
$(
struct $k {
view: cursive::views::NamedView<$v>,
}
impl $crate::tui::SingletonView<$v> for $k {
fn find(siv: &mut Cursive) -> cursive::views::ViewRef<$v> {
siv.find_name::<$v>(stringify!($k)).unwrap()
}
}
impl From<$v> for $k {
fn from(view: $v) -> Self {
use cursive::view::Nameable;
let view = view.with_name(stringify!($k));
$k { view }
}
}
impl cursive::view::ViewWrapper for $k {
cursive::wrap_impl!(self.view: cursive::views::NamedView<$v>);
}
)*
};
}
pub use git_record::testing;