use crate::evaluator::{EvaluationConfig, EvaluationContext, RuleEnvironment};
use crate::parser::ast::{MagicRule, MetaType, OffsetSpec, Operator, TypeKind, Value};
use crate::parser::name_table::NameTable;
pub fn make_context_with_env(name_table: NameTable, root_rules: &[MagicRule]) -> EvaluationContext {
let env = std::sync::Arc::new(RuleEnvironment {
name_table: std::sync::Arc::new(name_table),
root_rules: std::sync::Arc::from(root_rules),
});
EvaluationContext::new(EvaluationConfig::default()).with_rule_env(env)
}
pub fn use_rule(name: &str) -> MagicRule {
use_rule_at(name, 0)
}
pub fn use_rule_at(name: &str, offset: i64) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(offset),
typ: TypeKind::Meta(MetaType::Use(name.to_string())),
op: Operator::Equal,
value: Value::Uint(0),
message: format!("use {name}"),
children: vec![],
level: 0,
strength_modifier: None,
value_transform: None,
}
}
pub fn build_name_table(entries: Vec<(&str, Vec<MagicRule>)>) -> NameTable {
let mut top = Vec::new();
for (name, body) in entries {
top.push(MagicRule {
offset: OffsetSpec::Absolute(0),
typ: TypeKind::Meta(MetaType::Name(name.to_string())),
op: Operator::Equal,
value: Value::Uint(0),
message: String::new(),
children: body,
level: 0,
strength_modifier: None,
value_transform: None,
});
}
let (_rules, table) = crate::parser::name_table::extract_name_table(top);
table
}
pub fn default_rule(message: &str, children: Vec<MagicRule>) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(0),
typ: TypeKind::Meta(MetaType::Default),
op: Operator::Equal,
value: Value::Uint(0),
message: message.to_string(),
children,
level: 0,
strength_modifier: None,
value_transform: None,
}
}
pub fn clear_rule() -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(0),
typ: TypeKind::Meta(MetaType::Clear),
op: Operator::Equal,
value: Value::Uint(0),
message: String::new(),
children: vec![],
level: 0,
strength_modifier: None,
value_transform: None,
}
}
pub fn byte_eq_rule(offset: i64, value: u64, message: &str) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(offset),
typ: TypeKind::Byte { signed: false },
op: Operator::Equal,
value: Value::Uint(value),
message: message.to_string(),
children: vec![],
level: 0,
strength_modifier: None,
value_transform: None,
}
}
pub fn indirect_rule(offset: i64, message: &str, children: Vec<MagicRule>) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(offset),
typ: TypeKind::Meta(MetaType::Indirect),
op: Operator::Equal,
value: Value::Uint(0),
message: message.to_string(),
children,
level: 0,
strength_modifier: None,
value_transform: None,
}
}
pub fn offset_rule(offset: i64, message: &str, children: Vec<MagicRule>) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(offset),
typ: TypeKind::Meta(MetaType::Offset),
op: Operator::AnyValue,
value: Value::Uint(0),
message: message.to_string(),
children,
level: 0,
strength_modifier: None,
value_transform: None,
}
}