use std::time::Instant;
use shipper_registry::HttpRegistryClient as RegistryClient;
use shipper_types::{ReadinessConfig, ReadinessEvidence, ReconciliationOutcome};
use super::readiness::is_version_visible_with_backoff;
pub(super) fn reconcile_ambiguous_upload(
reg: &RegistryClient,
crate_name: &str,
version: &str,
config: &ReadinessConfig,
) -> (ReconciliationOutcome, Vec<ReadinessEvidence>) {
let start = Instant::now();
match is_version_visible_with_backoff(reg, crate_name, version, config) {
Ok((true, evidence)) => (
ReconciliationOutcome::Published {
attempts: evidence.len() as u32,
elapsed_ms: start.elapsed().as_millis() as u64,
},
evidence,
),
Ok((false, evidence)) => (
ReconciliationOutcome::NotPublished {
attempts: evidence.len() as u32,
elapsed_ms: start.elapsed().as_millis() as u64,
},
evidence,
),
Err(e) => (
ReconciliationOutcome::StillUnknown {
attempts: 0,
elapsed_ms: start.elapsed().as_millis() as u64,
reason: format!("reconciliation query failed: {e}"),
},
Vec::new(),
),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn published_outcome_carries_attempts_and_elapsed() {
let outcome = ReconciliationOutcome::Published {
attempts: 3,
elapsed_ms: 1500,
};
match outcome {
ReconciliationOutcome::Published {
attempts,
elapsed_ms,
} => {
assert_eq!(attempts, 3);
assert_eq!(elapsed_ms, 1500);
}
_ => panic!("expected Published"),
}
}
#[test]
fn still_unknown_carries_reason() {
let outcome = ReconciliationOutcome::StillUnknown {
attempts: 0,
elapsed_ms: 42,
reason: "query failed".to_string(),
};
match outcome {
ReconciliationOutcome::StillUnknown { reason, .. } => {
assert_eq!(reason, "query failed");
}
_ => panic!("expected StillUnknown"),
}
}
}