1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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;