use super::bindings as ffi;
use crate::error::{CpdbError, Result};
use std::ffi::CString;
use std::ptr::NonNull;
pub struct Settings {
raw: NonNull<ffi::cpdb_settings_t>,
}
unsafe impl Send for Settings {}
unsafe impl Sync for Settings {}
impl Settings {
pub fn new() -> Result<Self> {
let raw = unsafe { ffi::cpdbGetNewSettings() };
NonNull::new(raw)
.map(|raw| Self { raw })
.ok_or_else(|| CpdbError::BackendError("cpdbGetNewSettings returned null".into()))
}
pub fn try_clone(&self) -> Result<Self> {
let dst = Self::new()?;
unsafe { ffi::cpdbCopySettings(self.raw.as_ptr(), dst.raw.as_ptr()) };
Ok(dst)
}
pub fn add_setting(&mut self, key: &str, value: &str) -> Result<()> {
let key = CString::new(key)?;
let value = CString::new(value)?;
unsafe { ffi::cpdbAddSetting(self.raw.as_ptr(), key.as_ptr(), value.as_ptr()) };
Ok(())
}
pub fn clear_setting(&mut self, key: &str) -> Result<bool> {
let key = CString::new(key)?;
let existed = unsafe { ffi::cpdbClearSetting(self.raw.as_ptr(), key.as_ptr()) };
Ok(existed != 0)
}
pub fn save_to_disk(&self) -> Result<()> {
unsafe { ffi::cpdbSaveSettingsToDisk(self.raw.as_ptr()) };
Ok(())
}
pub fn read_from_disk() -> Result<Self> {
let raw = unsafe { ffi::cpdbReadSettingsFromDisk() };
NonNull::new(raw)
.map(|raw| Self { raw })
.ok_or_else(|| CpdbError::BackendError("cpdbReadSettingsFromDisk returned null".into()))
}
#[doc(hidden)]
pub fn as_raw(&self) -> *mut ffi::cpdb_settings_t {
self.raw.as_ptr()
}
}
impl Drop for Settings {
fn drop(&mut self) {
unsafe { ffi::cpdbDeleteSettings(self.raw.as_ptr()) };
}
}
pub struct Options {
raw: NonNull<ffi::cpdb_options_t>,
}
unsafe impl Send for Options {}
unsafe impl Sync for Options {}
impl Options {
pub fn new() -> Result<Self> {
let raw = unsafe { ffi::cpdbGetNewOptions() };
NonNull::new(raw)
.map(|raw| Self { raw })
.ok_or_else(|| CpdbError::BackendError("cpdbGetNewOptions returned null".into()))
}
#[doc(hidden)]
pub fn as_raw(&self) -> *mut ffi::cpdb_options_t {
self.raw.as_ptr()
}
}
impl Drop for Options {
fn drop(&mut self) {
unsafe { ffi::cpdbDeleteOptions(self.raw.as_ptr()) };
}
}
pub struct Media {
raw: NonNull<ffi::cpdb_media_t>,
}
unsafe impl Send for Media {}
unsafe impl Sync for Media {}
impl Media {
pub unsafe fn from_raw(raw: *mut ffi::cpdb_media_t) -> Result<Self> {
NonNull::new(raw)
.map(|raw| Self { raw })
.ok_or(CpdbError::NullPointer)
}
#[doc(hidden)]
pub fn as_raw(&self) -> *mut ffi::cpdb_media_t {
self.raw.as_ptr()
}
}
impl Drop for Media {
fn drop(&mut self) {
unsafe { ffi::cpdbDeleteMedia(self.raw.as_ptr()) };
}
}