use std::ffi::CString;
use std::os::raw::c_void;
use libduckdb_sys::{
duckdb_aggregate_function_get_extra_info, duckdb_aggregate_function_set_error,
duckdb_function_info,
};
#[mutants::skip] fn str_to_cstring(s: &str) -> CString {
CString::new(s).unwrap_or_else(|_| {
let pos = s.bytes().position(|b| b == 0).unwrap_or(s.len());
CString::new(&s.as_bytes()[..pos]).unwrap_or_default()
})
}
pub struct AggregateFunctionInfo {
info: duckdb_function_info,
}
impl AggregateFunctionInfo {
#[inline]
#[must_use]
pub const unsafe fn new(info: duckdb_function_info) -> Self {
Self { info }
}
#[must_use]
pub unsafe fn get_extra_info(&self) -> *mut c_void {
unsafe { duckdb_aggregate_function_get_extra_info(self.info) }
}
#[mutants::skip]
pub fn set_error(&self, message: &str) {
let c_msg = str_to_cstring(message);
unsafe {
duckdb_aggregate_function_set_error(self.info, c_msg.as_ptr());
}
}
#[must_use]
#[inline]
pub const fn as_raw(&self) -> duckdb_function_info {
self.info
}
}