use std::path::{Path, PathBuf};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BuildSystem {
Maven,
Gradle,
}
impl BuildSystem {
pub fn detect(base_dir: &Path) -> Option<Self> {
if base_dir.join("pom.xml").exists() {
return Some(BuildSystem::Maven);
}
if base_dir.join("build.gradle").exists()
|| base_dir.join("build.gradle.kts").exists() {
return Some(BuildSystem::Gradle);
}
if let Some(parent) = base_dir.parent() {
return Self::detect(parent);
}
None
}
pub fn build_file_name(&self) -> &'static str {
match self {
BuildSystem::Maven => "pom.xml",
BuildSystem::Gradle => "build.gradle",
}
}
pub fn build_file_path(&self, base_dir: &Path) -> PathBuf {
base_dir.join(self.build_file_name())
}
pub fn default_goals(&self) -> Vec<String> {
match self {
BuildSystem::Maven => vec!["compile".to_string()],
BuildSystem::Gradle => vec!["build".to_string()],
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
#[test]
fn test_detect_maven() {
let temp_dir = std::env::temp_dir().join("jbuild_test_maven");
std::fs::create_dir_all(&temp_dir).ok();
let pom_path = temp_dir.join("pom.xml");
fs::write(&pom_path, "<project></project>").unwrap();
assert_eq!(
BuildSystem::detect(&temp_dir),
Some(BuildSystem::Maven)
);
fs::remove_file(&pom_path).ok();
}
#[test]
fn test_detect_gradle() {
let temp_dir = std::env::temp_dir().join("jbuild_test_gradle");
std::fs::create_dir_all(&temp_dir).ok();
let gradle_path = temp_dir.join("build.gradle");
fs::write(&gradle_path, "plugins { }").unwrap();
assert_eq!(
BuildSystem::detect(&temp_dir),
Some(BuildSystem::Gradle)
);
fs::remove_file(&gradle_path).ok();
}
#[test]
fn test_detect_none() {
let temp_dir = std::env::temp_dir().join("jbuild_test_none");
std::fs::create_dir_all(&temp_dir).ok();
assert_eq!(BuildSystem::detect(&temp_dir), None);
}
}