use anyhow::Result;
use clap::Parser;
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
use bim::cli::{Cli, Commands};
use bim::{config, discovery, images, render, server, watch};
fn main() -> Result<()> {
tracing_subscriber::registry()
.with(fmt::layer())
.with(EnvFilter::from_default_env().add_directive("bim=info".parse()?))
.init();
let cli = Cli::parse();
match cli.command {
Commands::Build {
drafts,
output,
clean,
} => {
let config = config::Config {
include_drafts: drafts,
output_dir: output,
..Default::default()
};
if clean && config.output_dir.exists() {
std::fs::remove_dir_all(&config.output_dir)?;
tracing::info!("Cleaned output directory: {:?}", config.output_dir);
}
let site = discovery::discover_site(&config)?;
render::build_site(&site, &config)?;
tracing::info!("Build complete! Output: {:?}", config.output_dir);
}
Commands::Watch { drafts, output } => {
let config = config::Config {
include_drafts: drafts,
output_dir: output,
..Default::default()
};
watch::watch_and_rebuild(&config)?;
}
Commands::Serve {
port,
host,
drafts,
watch: enable_watch,
} => {
let config = config::Config {
include_drafts: drafts,
server_port: port,
server_host: host,
..Default::default()
};
let rt = tokio::runtime::Runtime::new()?;
rt.block_on(async {
if enable_watch {
server::serve_with_watch(&config).await
} else {
server::serve(&config).await
}
})?;
}
Commands::PrepImages { force, output } => {
let config = config::Config {
output_dir: output,
force_image_rebuild: force,
..Default::default()
};
images::process_images(&config)?;
tracing::info!("Image processing complete!");
}
}
Ok(())
}