libobs-wrapper 9.0.4+32.0.2

A safe wrapper around libobs
use crate::{
    data::object::ObsObjectTrait,
    macros::impl_eq_of_ptr,
    sources::{ObsFilterRef, ObsSourceSignals, _ObsRemoveFilterOnDrop},
    utils::ObsError,
};
use std::sync::Arc;

#[derive(Debug, Clone)]
pub struct ObsFilterGuardPair {
    filter: ObsFilterRef,
    pub(crate) _guard: Arc<_ObsRemoveFilterOnDrop>,
}

impl ObsFilterGuardPair {
    pub(crate) fn new(filter: ObsFilterRef, guard: Arc<_ObsRemoveFilterOnDrop>) -> Self {
        Self {
            filter,
            _guard: guard,
        }
    }

    pub fn get_inner(&self) -> &ObsFilterRef {
        &self.filter
    }

    pub fn get_inner_mut(&mut self) -> &mut ObsFilterRef {
        &mut self.filter
    }
}

#[allow(private_bounds)]
pub trait ObsSourceTrait: ObsObjectTrait<*mut libobs::obs_source_t> {
    fn signals(&self) -> &Arc<ObsSourceSignals>;

    fn get_active_filters(&self) -> Result<Vec<ObsFilterGuardPair>, ObsError>;
    fn apply_filter(&self, filter: &ObsFilterRef) -> Result<(), ObsError>;
}

impl_eq_of_ptr!(dyn ObsSourceTrait);