#![forbid(unsafe_code)]
pub mod correlate;
pub mod docx;
pub mod model;
pub mod pdf;
pub mod reconcile;
pub mod render;
pub mod report;
pub mod source;
pub mod sources;
pub mod timeline;
pub mod tz;
pub use correlate::{correlate, to_jsonl, CorrelatedAttribute, DeviceHistory, ProvenancedValue};
pub use docx::render_docx;
pub use model::{ArtifactContainer, Attribute, Claim, DeviceKey, Provenance, SourceKind, Value};
pub use pdf::render_pdf;
pub use reconcile::{canonicalize_mounted_volumes, reconcile_volume_serials};
pub use render::{format_epoch, render_accessed_files, render_report, render_table};
pub use report::audit;
pub use source::{correlate_sources, HistorySource};
pub use sources::apple_ipod::{parse_ipod_plist, AppleDevice, AppleIPodSource};
pub use sources::device_image::{
analyse_device_image, export_mbr_hex, parse_boot_sectors, DeviceImage, DeviceImageSource,
EncryptionKind,
};
pub use sources::emdmgmt::EmdMgmtSource;
pub use sources::jumplist::{JumpListArtifact, JumpListSource};
pub use sources::kernel_pnp::{kernel_pnp_events, KernelPnpEvent, KernelPnpSource};
pub use sources::lnk::{LnkArtifact, LnkSource};
pub use sources::macos_unified_log::{parse_unified_log, MacUnifiedLogSource, UsbEnumeration};
pub use sources::macos_usb::{parse_system_profiler, MacUsbDevice, MacUsbSource};
pub use sources::mountpoints2::MountPoints2Source;
pub use sources::partition_diag::PartitionDiagSource;
pub use sources::peripheral::PeripheralSource;
pub use sources::volume_cache::VolumeCacheSource;
pub use timeline::{super_timeline, timeline_to_jsonl, TimelineEvent};
pub use tz::normalize_local_clocks;
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)]
#[non_exhaustive]
pub enum Consistency {
SingleSource,
Corroborated,
Conflicting,
}
impl Consistency {
#[must_use]
pub const fn label(self) -> &'static str {
match self {
Self::SingleSource => "single-source",
Self::Corroborated => "corroborated",
Self::Conflicting => "conflicting",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn labels_are_stable_and_distinct() {
let all = [
Consistency::SingleSource,
Consistency::Corroborated,
Consistency::Conflicting,
];
let labels: Vec<&str> = all.iter().map(|c| c.label()).collect();
assert_eq!(labels, ["single-source", "corroborated", "conflicting"]);
assert_eq!(
labels
.iter()
.collect::<std::collections::HashSet<_>>()
.len(),
all.len(),
"labels must be distinct",
);
}
}