audb-cli 0.1.11

Command-line interface for AuDB database application framework
//! Code generation command
//!
//! Implements the `au generate` command for manually generating code from gold files.

use anyhow::{Context, Result};
use console::{Term, style};
use std::time::Instant;

/// Run the generate command
pub fn run(gold_dir: &str, output_dir: &str) -> Result<()> {
    let term = Term::stdout();
    let start = Instant::now();

    term.write_line("")?;
    term.write_line(&format!(
        "{} {}",
        style("Generating code from:").bold().cyan(),
        style(gold_dir).white()
    ))?;
    term.write_line(&format!(
        "{} {}",
        style("Output directory:").dim(),
        style(output_dir).white()
    ))?;
    term.write_line("")?;

    // Use the builder to generate code
    let report = audb_build::Builder::new()
        .gold_dir(gold_dir)
        .output_dir(output_dir)
        .emit_cargo_directives(false) // Don't emit cargo directives in manual mode
        .generate()
        .context("Failed to generate code")?;

    let duration = start.elapsed();

    // Print success
    term.write_line(&format!(
        "{} Code generation complete",
        style("").green().bold()
    ))?;
    term.write_line("")?;
    term.write_line(&format!(
        "  {} {} files processed",
        style("Files:").dim(),
        style(report.files_processed).green()
    ))?;
    term.write_line(&format!(
        "  {} {} schemas generated",
        style("Schemas:").dim(),
        style(report.schemas_generated).green()
    ))?;
    term.write_line(&format!(
        "  {} {} queries generated",
        style("Queries:").dim(),
        style(report.queries_generated).green()
    ))?;
    term.write_line(&format!(
        "  {} {} endpoints generated",
        style("Endpoints:").dim(),
        style(report.endpoints_generated).green()
    ))?;
    term.write_line(&format!(
        "  {} {:.1}ms",
        style("Time:").dim(),
        duration.as_secs_f64() * 1000.0
    ))?;
    term.write_line("")?;

    Ok(())
}