use std::path::Path;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LedgerRecord {
pub name: String,
pub recorded_at: String,
pub direction: String,
pub provenance: String,
pub checksum: Option<String>,
pub verified_at: Option<String>,
}
pub fn ledger_id_for_dir(migration_dir: &str) -> Option<&str> {
Path::new(migration_dir).file_name()?.to_str()
}
pub(super) fn legacy_bare_name(ledger_id: &str) -> Option<&str> {
let (prefix, name) = ledger_id.split_once('-')?;
(!name.is_empty() && prefix.bytes().all(|byte| byte.is_ascii_digit())).then_some(name)
}
pub fn display_name(ledger_id: &str) -> &str {
legacy_bare_name(ledger_id).unwrap_or(ledger_id)
}
pub fn identities_match(left: &str, right: &str) -> bool {
left == right || legacy_bare_name(left) == Some(right) || legacy_bare_name(right) == Some(left)
}
pub fn latest_status<'a>(
migration_id: &str,
rows: &'a [(String, String, String)],
) -> Option<(&'a str, &'a str)> {
let exact = rows.iter().rev().find(|(name, _, _)| name == migration_id);
let row = exact.or_else(|| {
let bare = legacy_bare_name(migration_id)?;
rows.iter().rev().find(|(name, _, _)| name == bare)
})?;
Some((row.1.as_str(), row.2.as_str()))
}
pub fn latest_record<'a>(migration_id: &str, rows: &'a [LedgerRecord]) -> Option<&'a LedgerRecord> {
let exact = rows.iter().rev().find(|record| record.name == migration_id);
exact.or_else(|| {
let bare = legacy_bare_name(migration_id)?;
rows.iter().rev().find(|record| record.name == bare)
})
}