agpm_cli/resolver/backtracking/
types.rs1#[derive(Debug, Clone)]
7pub struct BacktrackingIteration {
8 pub iteration: usize,
10
11 pub conflicts: Vec<crate::version::conflict::VersionConflict>,
13
14 pub updates: Vec<VersionUpdate>,
16
17 pub transitive_reresolutions: usize,
19
20 pub made_progress: bool,
22}
23
24#[derive(Debug, Clone, PartialEq, Eq)]
26pub enum TerminationReason {
27 Success,
29
30 MaxIterations,
32
33 Timeout,
35
36 NoProgress,
38
39 Oscillation,
41
42 NoCompatibleVersion,
44}
45
46#[derive(Debug, Clone)]
48pub struct BacktrackingResult {
49 pub resolved: bool,
51
52 pub updates: Vec<VersionUpdate>,
54
55 pub iterations: usize,
57
58 pub attempted_versions: usize,
60
61 pub iteration_history: Vec<BacktrackingIteration>,
63
64 pub total_transitive_reresolutions: usize,
66
67 pub termination_reason: TerminationReason,
69}
70
71#[derive(Debug, Clone)]
73pub struct VersionUpdate {
74 pub resource_id: String,
76
77 pub old_version: String,
79
80 pub new_version: String,
82
83 pub old_sha: String,
85
86 pub new_sha: String,
88
89 pub variant_inputs: Option<serde_json::Value>,
91}
92
93#[cfg(test)]
94mod tests {
95 use super::*;
96
97 #[test]
98 fn test_backtracking_result_structure() {
99 let result = BacktrackingResult {
100 resolved: true,
101 updates: vec![VersionUpdate {
102 resource_id: "community:test".to_string(),
103 old_version: "v1.0.0".to_string(),
104 new_version: "v1.0.1".to_string(),
105 old_sha: "abc123".to_string(),
106 new_sha: "def456".to_string(),
107 variant_inputs: None,
108 }],
109 iterations: 1,
110 attempted_versions: 5,
111 iteration_history: vec![],
112 total_transitive_reresolutions: 0,
113 termination_reason: TerminationReason::Success,
114 };
115
116 assert!(result.resolved);
117 assert_eq!(result.updates.len(), 1);
118 assert_eq!(result.iterations, 1);
119 assert_eq!(result.attempted_versions, 5);
120 assert_eq!(result.termination_reason, TerminationReason::Success);
121 }
122}