use governor_core::domain::dependency::DependencyGraph;
use governor_core::domain::version::SemanticVersion;
use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct PublicationCrate {
pub order: usize,
pub name: String,
pub version: String,
pub dependencies: Vec<String>,
pub status: String,
pub estimated_publish_time_sec: u64,
}
#[derive(Debug, Clone, Serialize)]
pub struct SkippedCrate {
pub name: String,
pub version: String,
pub reason: String,
pub published_date: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct Batch {
pub number: usize,
pub crates: Vec<String>,
pub can_parallelize: bool,
}
#[must_use]
pub fn build_publication_order(
publish_order: &[String],
new_version: &SemanticVersion,
dep_graph: &DependencyGraph,
) -> Vec<PublicationCrate> {
publish_order
.iter()
.enumerate()
.map(|(i, name)| PublicationCrate {
order: i + 1,
name: name.clone(),
version: new_version.to_string(),
dependencies: super::graph::get_dependencies_for(dep_graph, name),
status: "ready".to_string(),
estimated_publish_time_sec: 45,
})
.collect()
}
#[must_use]
pub fn build_batches(publish_order: &[String]) -> Vec<Batch> {
publish_order
.iter()
.enumerate()
.map(|(i, name)| Batch {
number: i + 1,
crates: vec![name.clone()],
can_parallelize: false,
})
.collect()
}
#[must_use]
pub fn get_skipped_crates(
include_published: bool,
new_version: &SemanticVersion,
) -> Vec<SkippedCrate> {
if include_published {
Vec::new()
} else {
vec![SkippedCrate {
name: "example-crate".to_string(),
version: new_version.to_string(),
reason: "already_published".to_string(),
published_date: Some(chrono::Utc::now().to_rfc3339()),
}]
}
}