use std::fmt::Debug;
use crate::{
data::{ImmutableObsData, ObsData, ObsObjectUpdater},
macros::trait_with_optional_send_sync,
runtime::ObsRuntime,
unsafe_send::SmartPointerSendable,
utils::{ObsError, ObsString},
};
mod macros;
pub(crate) use macros::*;
pub trait ObsObjectClone<K: Clone> {
fn clone_box(&self) -> Box<dyn ObsObjectTrait<K>>;
}
impl<T, K: Clone> ObsObjectClone<K> for T
where
T: ObsObjectTrait<K> + Clone + 'static,
{
fn clone_box(&self) -> Box<dyn ObsObjectTrait<K>> {
Box::new(self.clone())
}
}
impl<K: Clone> Clone for Box<dyn ObsObjectTrait<K>> {
fn clone(&self) -> Self {
self.clone_box()
}
}
trait_with_optional_send_sync! {
#[doc(hidden)]
pub trait ObsObjectTraitPrivate: Debug {
fn __internal_replace_settings(&self, settings: ImmutableObsData) -> Result<(), ObsError>;
fn __internal_replace_hotkey_data(&self, hotkey_data: ImmutableObsData)
-> Result<(), ObsError>;
}
}
#[allow(private_bounds)]
pub trait ObsObjectTrait<K: Clone>: ObsObjectClone<K> + ObsObjectTraitPrivate {
fn runtime(&self) -> &ObsRuntime;
fn settings(&self) -> Result<ImmutableObsData, ObsError>;
fn hotkey_data(&self) -> Result<ImmutableObsData, ObsError>;
fn id(&self) -> ObsString;
fn name(&self) -> ObsString;
fn update_settings(&self, settings: ObsData) -> Result<(), ObsError>;
fn create_updater<'a, T: ObsObjectUpdater<'a, K, ToUpdate = Self> + Send + Sync>(
&'a mut self,
) -> Result<T, ObsError>
where
Self: Sized + Send + Sync,
{
let runtime = self.runtime().clone();
T::create_update(runtime, self)
}
fn as_ptr(&self) -> SmartPointerSendable<K>;
}