summaryrefslogtreecommitdiffstats
path: root/src/main.rs
blob: 0dce57a46011cbdfb811687f7dd2f7f5316f316c (plain)
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
#[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::<Configuration>()?;

    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(())
}