use super::{
PrecompiledBytes, PrecompiledError, PrecompiledPatterns, ScannerPatternCache, group_prototype,
};
use std::{fmt, sync::Arc};
pub const PRECOMPILED_EAGER_FORMAT_VERSION: u32 = 3;
#[derive(Clone)]
pub struct PrecompiledEager {
programs: PrecompiledPatterns,
groups: Arc<group_prototype::GroupSource>,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[non_exhaustive]
pub struct PrecompiledEagerStats {
pub loaded_groups: usize,
pub invalid_groups: usize,
}
impl PrecompiledEager {
pub fn from_bytes(
programs: impl Into<Arc<[u8]>>,
groups: impl Into<Arc<[u8]>>,
) -> Result<Self, PrecompiledError> {
Self::from_shared_bytes(
PrecompiledBytes::from(programs.into()),
PrecompiledBytes::from(groups.into()),
)
}
pub fn from_shared_bytes(
programs: PrecompiledBytes,
groups: PrecompiledBytes,
) -> Result<Self, PrecompiledError> {
let programs = PrecompiledPatterns::from_shared_bytes(programs)?;
let groups = group_prototype::GroupSource::open_portable(groups, &programs)?;
Ok(Self {
programs,
groups: Arc::new(groups),
})
}
pub fn program_bytes(&self) -> &[u8] {
self.programs.archive_bytes()
}
pub fn group_bytes(&self) -> &[u8] {
self.groups.archive_bytes()
}
pub fn len(&self) -> usize {
self.groups.len()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn validate_groups(&self) -> Result<(), PrecompiledError> {
self.groups.validate_groups()
}
pub fn stats(&self) -> PrecompiledEagerStats {
let (loaded_groups, invalid_groups) = self.groups.load_stats();
PrecompiledEagerStats {
loaded_groups,
invalid_groups,
}
}
}
impl fmt::Debug for PrecompiledEager {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PrecompiledEager")
.field("programs", &self.programs.len())
.field("groups", &self.len())
.finish()
}
}
impl ScannerPatternCache {
pub fn export_precompiled_eager(&self) -> Result<PrecompiledEager, PrecompiledError> {
PrecompiledEager::from_bytes(
self.export_precompiled()?,
self.export_group_prototype(group_prototype::GroupKind::Portable)?,
)
}
pub fn add_precompiled_eager(&mut self, archive: PrecompiledEager) {
self.precompiled.push(archive.programs);
self.group_source = Some(archive.groups);
}
}