fn main()

in resctl-demo/src/main.rs [492:625]


fn main() {
    let matches = clap::App::new("resctl-demo")
        .version((*FULL_VERSION).as_str())
        .author(clap::crate_authors!("\n"))
        .about(std::str::from_utf8(include_bytes!("../README.md")).unwrap())
        .args_from_usage(&ARGS_STR)
        .setting(clap::AppSettings::UnifiedHelpMessage)
        .setting(clap::AppSettings::DeriveDisplayOrder)
        .get_matches();

    let args = Args {
        dir: match matches.value_of("dir") {
            Some(v) => v.into(),
            None => rd_agent_intf::Args::default().dir,
        },
        dev: matches.value_of("dev").unwrap_or("").into(),
        linux_tar: matches.value_of("linux").unwrap_or("").into(),
        keep: matches.is_present("keep"),
        no_iolat: matches.is_present("no-iolat"),
        force: matches.is_present("force"),
    };

    if let Err(e) = startup_checks() {
        if args.force {
            error!("Ignoring startup check failure: {}", &e);
        } else {
            panic!("Startup check failed: {}", &e);
        }
    }

    ARGS.lock().unwrap().replace(args);

    if std::env::var("RUST_LOG").is_ok() {
        init_logging(0);
    } else {
        logger::init();
    }
    log::set_max_level(log::LevelFilter::Info);

    info!("TEMP_DIR: {:?}", TEMP_DIR.path());
    touch_units();

    let mut siv = Cursive::default();
    set_cursive_theme(&mut siv);

    let _exit_guard = ExitGuard {};

    let mut upd = UPDATERS.lock().unwrap();
    upd.status
        .replace(status::Updater::new(siv.cb_sink().clone()));
    upd.graphs
        .append(&mut graph::updater_factory(siv.cb_sink().clone()));
    upd.journal.insert(
        JournalViewId::Default,
        journal::updater_factory(siv.cb_sink().clone(), JournalViewId::Default),
    );
    drop(upd);

    // global key bindings
    siv.add_global_callback('~', |siv| siv.toggle_debug_console());
    siv.add_global_callback('i', |siv| doc::show_doc(siv, "index", true, false));
    siv.add_global_callback('!', |siv| doc::show_doc(siv, "doc-format", true, false));
    siv.add_global_callback('r', |siv| {
        let id = doc::CUR_DOC.read().unwrap().id.clone();
        doc::show_doc(siv, &id, true, false);
    });
    siv.add_global_callback('b', |siv| {
        let mut doc_hist = doc::DOC_HIST.lock().unwrap();
        if let Some(id) = doc_hist.pop() {
            drop(doc_hist);
            doc::show_doc(siv, &id, true, true);
        }
    });
    siv.add_global_callback('q', |siv| {
        siv.add_layer(Dialog::around(TextView::new("Exiting...")));
        siv.quit();
    });
    siv.add_global_callback(event::Event::CtrlChar('l'), |siv| {
        siv.clear();
    });
    siv.add_global_callback(event::Event::Key(event::Key::Esc), |siv| {
        AGENT_ZV_REQ.store(false, Ordering::Relaxed);
        update_agent_zoomed_view(siv);
        toggle_zoomed_view(siv, None)
    });
    siv.add_global_callback('a', |siv| {
        let req = !AGENT_ZV_REQ.load(Ordering::Relaxed);
        AGENT_ZV_REQ.store(req, Ordering::Relaxed);
        update_agent_zoomed_view(siv);
    });
    siv.add_global_callback('g', |siv| toggle_zoomed_view(siv, Some(ZoomedView::Graphs)));
    siv.add_global_callback('l', |siv| {
        toggle_zoomed_view(siv, Some(ZoomedView::Journals))
    });
    siv.add_global_callback('t', |_siv| {
        graph::graph_intv_next();
        kick_refresh();
    });
    siv.add_global_callback('T', |_siv| {
        graph::graph_intv_prev();
        kick_refresh();
    });

    siv.set_global_callback(event::Event::WindowResize, move |siv| {
        // see https://github.com/gyscos/cursive/issues/519#issuecomment-721966516
        siv.clear();
        refresh_layout_and_kick(siv);
    });

    siv.add_global_callback(event::Event::Key(event::Key::Right), |siv| {
        if ZOOMED_VIEW.lock().unwrap().last() == Some(&ZoomedView::Graphs) {
            graph::graph_tab_next(siv)
        }
    });
    siv.add_global_callback(event::Event::Key(event::Key::Left), |siv| {
        if ZOOMED_VIEW.lock().unwrap().last() == Some(&ZoomedView::Graphs) {
            graph::graph_tab_prev(siv)
        }
    });

    refresh_layout_and_kick(&mut siv);
    update_agent_zoomed_view(&mut siv);

    // Run the event loop. Use the termion backend so that resctl-demo can
    // be built without external dependencies. The buffered backend wrapping
    // is necessary to avoid flickering, see
    // https://github.com/gyscos/cursive/issues/525.
    siv.run_with(|| {
        let termion_backend = cursive::backends::termion::Backend::init().unwrap();
        Box::new(cursive_buffered_backend::BufferedBackend::new(
            termion_backend,
        ))
    })
}