use crate::{sys, Property};
use std::marker::PhantomData;
use std::ptr::NonNull;
pub struct ObjectSetRef<'a>(NonNull<sys::FcObjectSet>, PhantomData<&'a sys::FcObjectSet>);
impl ObjectSetRef<'_> {
pub fn as_ptr(&self) -> *mut sys::FcObjectSet {
self.0.as_ptr()
}
}
pub struct ObjectSet(NonNull<sys::FcObjectSet>);
impl ObjectSet {
pub fn new(props: &[Property]) -> ObjectSet {
super::init();
let ptr = unsafe { sys::FcObjectSetCreate() };
let ptr = NonNull::new(ptr).unwrap();
for prop in props {
unsafe { sys::FcObjectSetAdd(ptr.as_ptr(), prop.to_raw().as_ptr()) };
}
ObjectSet(ptr)
}
pub fn all() -> ObjectSet {
use Property::*;
ObjectSet::new(&[
Family, Style, Slant, Weight, Width, File, Index, FullName, FontFormat,
])
}
pub fn as_ref(&self) -> ObjectSetRef<'_> {
ObjectSetRef(self.0, PhantomData)
}
}
impl Drop for ObjectSet {
fn drop(&mut self) {
unsafe { sys::FcObjectSetDestroy(self.0.as_ptr()) }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_add() {
let _ = ObjectSet::new(&[Property::File, Property::Width]).as_ref();
}
}