use color_eyre::{
eyre::{self, WrapErr},
Result,
};
use logging::{LogCollector, LogMessage};
use parking_lot::Mutex;
use std::{panic, sync::Arc};
use tracing::{error, info, metadata::LevelFilter};
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::{fmt, prelude::*, EnvFilter, Registry};
mod app;
mod authentication;
mod config;
mod event;
mod home;
pub mod logging;
mod root;
mod tui;
mod widgets;
#[tokio::main]
async fn main() -> Result<()> {
let (logs, _guard) = setup_logging()?;
info!("Starting");
panic::set_hook(Box::new(|info| {
error!("Panic: {:?}", info);
}));
app::run(logs).await?;
info!("Exiting");
Ok(())
}
fn setup_logging() -> Result<(Arc<Mutex<Vec<LogMessage>>>, WorkerGuard)> {
let log_folder = xdg::BaseDirectories::with_prefix("tooters")
.wrap_err("failed to get XDG base directories")?
.get_state_home();
let file_appender = tracing_appender::rolling::hourly(log_folder, "tooters.log");
let (non_blocking, guard) = tracing_appender::non_blocking(file_appender);
let log_collector = LogCollector::default();
let logs = log_collector.logs();
let subscriber = Registry::default()
.with(EnvFilter::from_default_env().add_directive(LevelFilter::INFO.into()))
.with(
fmt::layer()
.with_writer(non_blocking)
.with_timer(tracing_subscriber::fmt::time::uptime()),
)
.with(log_collector);
tracing::subscriber::set_global_default(subscriber)
.wrap_err("setting default subscriber failed")?;
Ok((logs, guard))
}
pub fn install_hooks() -> Result<()> {
let hook_builder = color_eyre::config::HookBuilder::default();
let (panic_hook, eyre_hook) = hook_builder.into_hooks();
let panic_hook = panic_hook.into_panic_hook();
panic::set_hook(Box::new(move |panic_info| {
tui::restore().unwrap();
panic_hook(panic_info);
}));
let eyre_hook = eyre_hook.into_eyre_hook();
eyre::set_hook(Box::new(move |error| {
tui::restore().unwrap();
eyre_hook(error)
}))?;
Ok(())
}