use std::{env::VarError, error::Error, ffi::OsString};
use clap::Parser;
use rayon::iter::{IntoParallelIterator, ParallelIterator};
use tracing::info;
use tracing_error::ErrorLayer;
use tracing_subscriber::{EnvFilter, filter::FromEnvError, prelude::*};
use tyrol::Bundler;
#[derive(clap::Parser)]
#[command(about = "🏔️ tyrol rolls up types into bundles")]
struct Options {
#[arg(value_name = "ENTRYPOINT", required = true)]
entrypoints: Vec<OsString>,
}
fn main() -> color_eyre::Result<()> {
setup_tracing()?;
color_eyre::install()?;
let opt = Options::parse();
let bundler = Bundler::new(std::env::current_dir()?);
let results = opt
.entrypoints
.into_par_iter()
.map(|entrypoint| {
info!("bundling types for {}", entrypoint.display());
bundler.bundle(entrypoint)
})
.collect::<Vec<_>>();
for result in results {
result?;
}
Ok(())
}
fn setup_tracing() -> Result<(), FromEnvError> {
let filter_layer = EnvFilter::try_from_default_env().or_else(|err| {
fn as_env_error(err: &FromEnvError) -> Option<&VarError> {
err.source()?.downcast_ref()
}
match as_env_error(&err) {
Some(var_err) if matches!(var_err, VarError::NotPresent) => {
Ok(EnvFilter::new("warn,tyrol=info"))
}
_ => Err(err),
}
})?;
let fmt_layer = tracing_subscriber::fmt::layer().without_time();
tracing_subscriber::registry()
.with(filter_layer)
.with(fmt_layer)
.with(ErrorLayer::default())
.init();
Ok(())
}