bim 0.1.0

A content-first static site generator for blogs, digital gardens, and knowledge bases
Documentation
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(())
}