pub fn evaluate_rules(
rules: &[MagicRule],
buffer: &[u8],
context: &mut EvaluationContext,
) -> Result<Vec<RuleMatch>, LibmagicError>Expand description
Evaluate a list of magic rules against a file buffer with hierarchical processing
This function implements the core hierarchical rule evaluation algorithm with graceful error handling:
- Evaluates each top-level rule in sequence
- If a parent rule matches, evaluates its child rules for refinement
- Collects all matches or stops at first match based on configuration
- Maintains evaluation context for recursion limits and state
- Implements graceful degradation by skipping problematic rules and continuing evaluation
The hierarchical evaluation follows these principles:
- Parent rules must match before children are evaluated
- Child rules provide refinement and additional detail
- Evaluation can stop at first match or continue for all matches
- Recursion depth is limited to prevent infinite loops
- Problematic rules are skipped to allow evaluation to continue
§Arguments
rules- The list of magic rules to evaluatebuffer- The file buffer to evaluate againstcontext- Mutable evaluation context for state management
§Returns
Returns Ok(Vec<RuleMatch>) containing all matches found. Errors in individual rules
are skipped to allow evaluation to continue. Only returns Err(LibmagicError)
for critical failures like timeout or recursion limit exceeded.
§Examples
use libmagic_rs::evaluator::{evaluate_rules, EvaluationContext, RuleMatch};
use libmagic_rs::parser::ast::{MagicRule, OffsetSpec, TypeKind, Operator, Value};
use libmagic_rs::EvaluationConfig;
// Create a hierarchical rule set for ELF files
let parent_rule = MagicRule {
offset: OffsetSpec::Absolute(0),
typ: TypeKind::Byte { signed: true },
op: Operator::Equal,
value: Value::Uint(0x7f),
message: "ELF".to_string(),
children: vec![
MagicRule {
offset: OffsetSpec::Absolute(4),
typ: TypeKind::Byte { signed: true },
op: Operator::Equal,
value: Value::Uint(2),
message: "64-bit".to_string(),
children: vec![],
level: 1,
strength_modifier: None,
}
],
level: 0,
strength_modifier: None,
};
let rules = vec![parent_rule];
let buffer = &[0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01]; // ELF64 header
let config = EvaluationConfig::default();
let mut context = EvaluationContext::new(config);
let matches = evaluate_rules(&rules, buffer, &mut context).unwrap();
assert_eq!(matches.len(), 2); // Parent and child should both match§Errors
LibmagicError::Timeout- If evaluation exceeds configured timeoutLibmagicError::EvaluationError- Only for critical failures like recursion limit exceeded
Individual rule evaluation errors are handled gracefully and do not stop the overall evaluation.