recutils_rs/
selection_expression.rs1use crate::ffi::*;
2use crate::record::RecordRef;
3use crate::{Error, cstring, ensure_init};
4
5pub struct SelectionExpression {
7 ptr: rec_sex_t,
8}
9
10impl SelectionExpression {
11 pub fn compile(expr: &str, case_insensitive: bool) -> Result<Self, Error> {
12 ensure_init();
13 let c_expr = cstring(expr, "selection expression")?;
14 unsafe {
15 let ptr = rec_sex_new(case_insensitive);
16 if ptr.is_null() {
17 return Err(Error::new("rec_sex_new returned NULL"));
18 }
19 if !rec_sex_compile(ptr, c_expr.as_ptr()) {
20 rec_sex_destroy(ptr);
21 return Err(Error::new(format!("failed to compile expression {expr:?}")));
22 }
23 Ok(SelectionExpression { ptr })
24 }
25 }
26
27 pub fn matches(&self, record: &RecordRef<'_>) -> bool {
28 let mut status = false;
29 let ok = unsafe { rec_sex_eval(self.ptr, record.as_ptr(), &mut status) };
30 ok && status
31 }
32}
33
34impl Drop for SelectionExpression {
35 fn drop(&mut self) {
36 unsafe { rec_sex_destroy(self.ptr) }
37 }
38}