use crate::model::Claim;
use crate::DeviceHistory;
pub trait HistorySource {
fn claims(&self) -> Vec<Claim>;
}
#[must_use]
pub fn correlate_sources(sources: &[&dyn HistorySource]) -> Vec<DeviceHistory> {
let all: Vec<Claim> = sources.iter().flat_map(|s| s.claims()).collect();
let reconciled = crate::reconcile_volume_serials(&all);
crate::correlate(&reconciled)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::model::{Attribute, DeviceKey, Provenance, SourceKind, Value};
use crate::Consistency;
struct Mock(Vec<Claim>);
impl HistorySource for Mock {
fn claims(&self) -> Vec<Claim> {
self.0.clone()
}
}
fn claim(src: SourceKind) -> Claim {
Claim {
device: DeviceKey("SN1".into()),
attribute: Attribute::FirstConnected,
value: Value::Timestamp(1_700_000_000),
provenance: Provenance {
source: src,
locator: "x".into(),
},
}
}
#[test]
fn correlate_sources_merges_claims_from_every_source() {
let a = Mock(vec![claim(SourceKind::Usbstor)]);
let b = Mock(vec![claim(SourceKind::SetupApi)]);
let sources: [&dyn HistorySource; 2] = [&a, &b];
let hist = correlate_sources(&sources);
assert_eq!(hist.len(), 1);
assert_eq!(hist[0].attributes[0].consistency, Consistency::Corroborated);
}
}