use crate::core::{MavenProject, MavenSession};
use crate::error::MavenResult;
use std::path::Path;
pub trait ProjectBuildStrategy {
fn build(&self, pom_file: &Path) -> MavenResult<MavenProject>;
fn build_reactor(&self, pom_file: &Path) -> MavenResult<Vec<MavenProject>>;
}
pub trait LifecycleExecutionStrategy {
fn execute(
&self,
session: &MavenSession,
goals: &[String],
) -> MavenResult<LifecycleExecutionResult>;
}
#[derive(Debug, Clone)]
pub struct LifecycleExecutionResult {
pub success: bool,
pub exceptions: Vec<String>,
}
impl LifecycleExecutionResult {
pub fn success() -> Self {
Self {
success: true,
exceptions: vec![],
}
}
pub fn failure(reason: String) -> Self {
Self {
success: false,
exceptions: vec![reason],
}
}
pub fn add_exception(&mut self, exception: String) {
self.exceptions.push(exception);
self.success = false;
}
}
pub trait DependencyResolutionStrategy {
fn resolve_dependency(
&self,
group_id: &str,
artifact_id: &str,
version: &str,
) -> MavenResult<Option<String>>;
fn resolve_dependencies(
&self,
dependencies: &[(String, String, String)],
) -> MavenResult<Vec<String>>;
}
pub trait ArtifactRepository: Send + Sync {
fn exists(&self, group_id: &str, artifact_id: &str, version: &str) -> bool;
fn get_path(&self, group_id: &str, artifact_id: &str, version: &str) -> MavenResult<String>;
fn store(&self, group_id: &str, artifact_id: &str, version: &str, path: &Path) -> MavenResult<()>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_lifecycle_execution_result_success() {
let result = LifecycleExecutionResult::success();
assert!(result.success);
assert!(result.exceptions.is_empty());
}
#[test]
fn test_lifecycle_execution_result_failure() {
let result = LifecycleExecutionResult::failure("Test error".to_string());
assert!(!result.success);
assert_eq!(result.exceptions.len(), 1);
}
#[test]
fn test_lifecycle_execution_result_add_exception() {
let mut result = LifecycleExecutionResult::success();
result.add_exception("Error 1".to_string());
assert!(!result.success);
assert_eq!(result.exceptions.len(), 1);
}
}