#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i32)]
pub enum Sensitivity {
Low = 0,
High = 1,
Full = 2,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i32)]
pub enum SecondaryMode {
Tag = 0,
Record = 1,
Omit = 2,
}
#[derive(Debug, Clone)]
pub struct MapperOptions {
pub error_rate: f32,
pub strata_rate: f32,
pub strata_count: Option<u32>,
pub sensitivity: Sensitivity,
pub threads: usize,
pub secondary_mode: SecondaryMode,
pub align_secondary: bool,
pub verify_matches: bool,
pub verbose: u32,
pub library_length: u32,
pub library_dev: u32,
}
impl Default for MapperOptions {
fn default() -> Self {
Self {
error_rate: 0.05,
strata_rate: 0.00,
strata_count: None,
sensitivity: Sensitivity::High,
threads: std::thread::available_parallelism().map(std::num::NonZero::get).unwrap_or(1),
secondary_mode: SecondaryMode::Tag,
align_secondary: false,
verify_matches: true,
verbose: 0,
library_length: 0,
library_dev: 0,
}
}
}
impl MapperOptions {
#[expect(
clippy::cast_possible_wrap,
clippy::cast_possible_truncation,
reason = "FFI boundary: all values fit in i32 for the C API"
)]
pub(crate) fn to_ffi(&self) -> yara_mapper_sys::YaraMapperOptions {
yara_mapper_sys::YaraMapperOptions {
error_rate: self.error_rate,
strata_rate: self.strata_rate,
strata_count: self.strata_count.map_or(-1, |c| c as i32),
sensitivity: self.sensitivity as i32,
threads: self.threads as i32,
secondary_mode: self.secondary_mode as i32,
align_secondary: i32::from(self.align_secondary),
verify_matches: i32::from(self.verify_matches),
verbose: self.verbose as i32,
library_length: self.library_length as i32,
library_dev: self.library_dev as i32,
}
}
}