cargo-governor 2.0.0

Machine-First, LLM-Ready, CI/CD-Native release automation tool for Rust crates
Documentation
//! Publication order building for plan service

use governor_core::domain::dependency::DependencyGraph;
use governor_core::domain::version::SemanticVersion;
use serde::Serialize;

/// Publication crate info
#[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,
}

/// Skipped crate info
#[derive(Debug, Clone, Serialize)]
pub struct SkippedCrate {
    pub name: String,
    pub version: String,
    pub reason: String,
    pub published_date: Option<String>,
}

/// Batch info
#[derive(Debug, Clone, Serialize)]
pub struct Batch {
    pub number: usize,
    pub crates: Vec<String>,
    pub can_parallelize: bool,
}

/// Build publication order with metadata
#[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()
}

/// Build batches from publish order
#[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()
}

/// Get skipped crates
#[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()),
        }]
    }
}