use std::fs::File;
use std::ops::Deref;
use memmap2::Mmap;
#[derive(Debug)]
#[non_exhaustive]
pub enum FileData {
Mapped(Mmap, File),
Loaded(Vec<u8>),
}
impl Deref for FileData {
type Target = [u8];
fn deref(&self) -> &[u8] {
match self {
Self::Mapped(mmap, _file) => mmap,
Self::Loaded(vec) => vec,
}
}
}
impl AsRef<[u8]> for FileData {
fn as_ref(&self) -> &[u8] {
self
}
}
const _: () = {
const fn assert_send_sync<T: Send + Sync>() {}
#[allow(dead_code)]
const fn check() {
assert_send_sync::<FileData>();
}
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn loaded_variant_derefs_to_bytes() {
let data = FileData::Loaded(vec![0xDE, 0xAD, 0xBE, 0xEF]);
let bytes: &[u8] = &data;
assert_eq!(bytes, &[0xDE, 0xAD, 0xBE, 0xEF]);
}
#[test]
fn loaded_variant_as_ref() {
let data = FileData::Loaded(vec![1, 2, 3]);
let bytes: &[u8] = data.as_ref();
assert_eq!(bytes, &[1, 2, 3]);
}
#[test]
fn empty_loaded_variant() {
let data = FileData::Loaded(vec![]);
assert!(data.is_empty());
assert_eq!(data.len(), 0);
}
}