use std::ffi::CString;
use std::os::raw::c_int;
use crate::error::{check_error, Result};
use crate::ffi;
pub struct Fts {
ptr: *mut ffi::zvec_fts_t,
}
impl Fts {
pub fn new() -> Result<Self> {
let ptr = unsafe { ffi::zvec_fts_create() };
if ptr.is_null() {
return Err(crate::error::Error::InternalError(
"zvec_fts_create returned null".into(),
));
}
Ok(Self { ptr })
}
pub fn set_query_string(&mut self, s: &str) -> Result<&mut Self> {
let cstr =
CString::new(s).map_err(|e| crate::error::Error::InvalidArgument(e.to_string()))?;
let code = unsafe { ffi::zvec_fts_set_query_string(self.ptr, cstr.as_ptr()) };
check_error(code as c_int)?;
Ok(self)
}
pub fn set_match_string(&mut self, s: &str) -> Result<&mut Self> {
let cstr =
CString::new(s).map_err(|e| crate::error::Error::InvalidArgument(e.to_string()))?;
let code = unsafe { ffi::zvec_fts_set_match_string(self.ptr, cstr.as_ptr()) };
check_error(code as c_int)?;
Ok(self)
}
pub(crate) fn as_ptr(&self) -> *mut ffi::zvec_fts_t {
self.ptr
}
}
impl Default for Fts {
fn default() -> Self {
Self::new().expect("zvec_fts_create failed in Default")
}
}
impl Drop for Fts {
fn drop(&mut self) {
if !self.ptr.is_null() {
unsafe { ffi::zvec_fts_destroy(self.ptr) };
}
}
}