use std::collections::HashMap;
use crate::config::{
ConfigSourcePolicy, EnvVar, ProfileLayer, ResolvedProfile, SourceConstraints, SourceSpec,
};
mod constraints;
mod engine;
mod layers;
mod merge;
mod packages;
mod permissions;
mod policy;
mod record;
#[cfg(test)]
mod tests;
pub use constraints::{check_locked_violations, validate_constraints};
pub use engine::compose;
pub use packages::merge_packages;
pub use permissions::{PermissionChange, detect_permission_changes};
#[cfg(test)]
use {constraints::*, layers::*, packages::*, permissions::*, policy::*, record::*};
#[derive(Debug, Clone)]
pub struct ConflictResolution {
pub resource_id: String,
pub resolution_type: ResolutionType,
pub winning_source: String,
pub details: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ResolutionType {
Locked,
Required,
Override,
Rejected,
Default,
}
impl ResolutionType {
pub fn label(&self) -> &str {
match self {
ResolutionType::Locked => "LOCKED",
ResolutionType::Required => "REQUIRED",
ResolutionType::Override => "OVERRIDE",
ResolutionType::Rejected => "REJECTED",
ResolutionType::Default => "DEFAULT",
}
}
}
#[derive(Debug)]
pub struct CompositionInput {
pub source_name: String,
pub priority: u32,
pub policy: ConfigSourcePolicy,
pub constraints: SourceConstraints,
pub layers: Vec<ProfileLayer>,
pub subscription: SubscriptionConfig,
}
#[derive(Debug, Clone, Default)]
pub struct SubscriptionConfig {
pub accept_recommended: bool,
pub opt_in: Vec<String>,
pub overrides: serde_yaml::Value,
pub reject: serde_yaml::Value,
}
impl SubscriptionConfig {
pub fn from_spec(spec: &SourceSpec) -> Self {
Self {
accept_recommended: spec.subscription.accept_recommended,
opt_in: spec.subscription.opt_in.clone(),
overrides: spec.subscription.overrides.clone(),
reject: spec.subscription.reject.clone(),
}
}
}
#[derive(Debug)]
pub struct CompositionResult {
pub resolved: ResolvedProfile,
pub conflicts: Vec<ConflictResolution>,
pub source_env: HashMap<String, Vec<EnvVar>>,
pub source_commits: HashMap<String, String>,
}