use crate::SourceKind;
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
pub enum SolveObjective {
MinMovesFromCurrent,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
pub enum OrderConstraint {
SourceBefore {
a: PathBuf,
b: PathBuf,
},
SourceAfter {
a: PathBuf,
b: PathBuf,
},
WinnerMustBe {
path_glob: String,
source_glob: String,
},
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
pub struct SolveRequest {
pub current_order: Vec<PathBuf>,
pub constraints: Vec<OrderConstraint>,
pub objective: SolveObjective,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
pub enum SolveStatus {
Satisfiable,
Unsatisfiable,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
pub struct ConstraintViolation {
pub constraint_index: usize,
pub message: String,
pub sample_key: Option<PathBuf>,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
pub struct SolveDiagnostics {
pub violated_constraints: Vec<ConstraintViolation>,
pub move_count: usize,
pub changed_winners: usize,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
pub struct SolveResult {
pub status: SolveStatus,
pub order: Option<Vec<PathBuf>>,
pub diagnostics: SolveDiagnostics,
}
#[derive(Debug, Clone)]
pub(super) enum CompiledConstraint {
SourceBefore {
constraint_index: usize,
a_idx: usize,
b_idx: usize,
a: PathBuf,
b: PathBuf,
},
SourceAfter {
constraint_index: usize,
a_idx: usize,
b_idx: usize,
a: PathBuf,
b: PathBuf,
},
WinnerMustBe {
constraint_index: usize,
path_glob: String,
source_glob: String,
matched_key_indices: Vec<usize>,
allowed_sources: Vec<bool>,
},
}
pub(super) struct SolveEvalContext<'a> {
pub(super) source_count: usize,
pub(super) constraints: &'a [CompiledConstraint],
pub(super) keys: &'a [PathBuf],
pub(super) providers_by_key: &'a [&'a [usize]],
pub(super) source_kinds: &'a [SourceKind],
}