#[macro_use] extern crate anyhow; #[macro_use] extern crate log; use std::rc::Rc; use anyhow::Result; use cursive::Cursive; use cursive::CursiveExt; use cursive::event::{Event, EventTrigger}; use cursive_flexi_logger_view::FlexiLoggerView; use flexi_logger::{Logger, LogTarget}; mod configuration; mod runtime; mod tabs; mod util; mod views; use crate::configuration::Configuration; use crate::runtime::Runtime; fn main() -> Result<()> { let mut siv = cursive::Cursive::default(); Logger::with_env_or_str("debug") .log_target(LogTarget::FileAndWriter( cursive_flexi_logger_view::cursive_flexi_logger(&siv), )) .directory("logs") .suppress_timestamp() .format(flexi_logger::colored_with_thread) .start() .expect("failed to initialize logger!"); debug!("Loading configuration"); let mut config = config::Config::default(); config .merge(config::File::with_name("config"))? .merge(config::Environment::with_prefix("MUAR"))?; let config = config.try_into::()?; debug!("Setting triggers"); let trigger: EventTrigger = Event::Char('q').into(); siv.set_on_post_event(trigger, |s| s.quit()); let runtime = Runtime::new(config)?; debug!("Adding mainview"); siv.add_fullscreen_layer(crate::views::main::MainView::new(Rc::new(runtime))?); crate::views::menu::init(&mut siv); siv.add_global_callback(cursive::event::Event::Char(':') , |s| s.select_menubar()); siv.add_global_callback('~', |siv: &mut Cursive| siv.add_layer(FlexiLoggerView::scrollable())); debug!("Starting cursive"); siv.run(); Ok(()) }