panorama/src/main.rs
2021-02-19 19:44:04 -06:00

69 lines
2 KiB
Rust

#[macro_use]
extern crate tracing;
use std::path::PathBuf;
use anyhow::Result;
use futures::future::TryFutureExt;
use panorama::{config::spawn_config_watcher_system, mail, report_err, ui};
use structopt::StructOpt;
use tokio::sync::mpsc;
use xdg::BaseDirectories;
#[derive(Debug, StructOpt)]
#[structopt(author, about)]
struct Opt {
/// The path to the log file. By default, does not log.
#[structopt(long = "log-file")]
log_file: Option<PathBuf>,
}
#[tokio::main(flavor = "multi_thread")]
async fn main() -> Result<()> {
// parse command line arguments into options struct
let _opt = Opt::from_args();
// print logs to file as directed by command line options
use tracing_subscriber::filter::LevelFilter;
let file = tracing_appender::rolling::daily("public", "lol");
let (non_blocking, _guard) = tracing_appender::non_blocking(file);
tracing_subscriber::fmt()
.with_max_level(LevelFilter::TRACE)
.with_writer(non_blocking)
.with_thread_ids(true)
.init();
debug!("shiet");
// TODO: debug
let x = span!(tracing::Level::WARN, "ouais");
let _y = x.enter();
let _xdg = BaseDirectories::new()?;
let (_config_thread, config_update) = spawn_config_watcher_system()?;
// used to notify the runtime that the process should exit
let (exit_tx, mut exit_rx) = mpsc::channel::<()>(1);
// used to send commands to the mail service
let (_mail_tx, mail_rx) = mpsc::unbounded_channel();
tokio::spawn(async move {
let config_update = config_update.clone();
mail::run_mail(config_update, mail_rx)
.unwrap_or_else(report_err)
.await;
});
let stdout = std::io::stdout();
tokio::spawn(ui::run_ui(stdout, exit_tx).unwrap_or_else(report_err));
exit_rx.recv().await;
// TODO: graceful shutdown
// yada yada create a background process and pass off the connections so they can be safely
// shutdown
std::process::exit(0);
// Ok(())
}