Skip to main content

recutils_rs/
selection_expression.rs

1use crate::ffi::*;
2use crate::record::RecordRef;
3use crate::{Error, cstring, ensure_init};
4
5/// A compiled selection expression — equivalent to `recsel -e <expr>`.
6pub 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}