bloomery 1.7.0

A lightweight, minimalist build system for Java written in Rust.
use anyhow::Result;
use std::fs;
use std::path::{Path, PathBuf};
use std::process::Command;

use crate::config::load_config;

fn find_java_files(dir: &Path) -> Result<Vec<PathBuf>> {
    let mut files = Vec::new();
    if !dir.exists() {
        return Ok(files);
    }

    for entry in fs::read_dir(dir)? {
        let entry = entry?;
        let path = entry.path();
        if path.is_dir() {
            files.extend(find_java_files(&path)?);
        } else if path.extension().is_some_and(|ext| ext == "java") {
            files.push(path);
        }
    }
    Ok(files)
}

// build function to compile java code
pub fn build() -> Result<()> {
    let config = load_config()?;
    info!("Building project '{}' v{}", config.name, config.version);

    let src_dir = Path::new("src");
    let java_files = find_java_files(src_dir)?;

    if java_files.is_empty() {
        error!("No .java file found at src/");
    }

    fs::create_dir_all(&config.class_dir)?;

    let status = match Command::new("javac")
        .arg("-d")
        .arg(&config.class_dir)
        .arg("-encoding")
        .arg("UTF-8")
        .args(&java_files)
        .status()
    {
        Ok(status) => status,
        Err(_) => {
            error!("javac not found.");
        }
    };

    if !status.success() {
        error!("Compilation failed");
    }

    success!("Build successfully ({} files)", java_files.len());
    Ok(())
}