use std::{
fmt::Debug,
sync::{Mutex, MutexGuard, atomic::AtomicBool},
};
use crate::{Callback, CallbackInfo, Controls, Error, Result, Source};
pub struct SharedData {
controls: Mutex<Controls>,
source: Mutex<Option<Box<dyn Source>>>,
prefetch_src: Mutex<Option<Box<dyn Source>>>,
pub(super) prefetch_notify: AtomicBool,
callback: Callback<CallbackInfo>,
err_callback: Callback<Error>,
}
impl SharedData {
pub(super) fn new() -> Self {
Self {
controls: Mutex::new(Controls::new()),
source: Mutex::new(None),
prefetch_src: Mutex::new(None),
prefetch_notify: true.into(),
callback: Callback::default(),
err_callback: Callback::default(),
}
}
pub(super) fn controls(&self) -> Result<MutexGuard<'_, Controls>> {
Ok(self.controls.lock()?)
}
pub(super) fn source(
&self,
) -> Result<MutexGuard<'_, Option<Box<dyn Source>>>> {
Ok(self.source.lock()?)
}
pub(super) fn prefech_src(
&self,
) -> Result<MutexGuard<'_, Option<Box<dyn Source>>>> {
Ok(self.prefetch_src.lock()?)
}
pub(super) fn invoke_callback(&self, args: CallbackInfo) -> Result<()> {
self.callback.invoke(args)
}
pub(super) fn invoke_err_callback(&self, args: Error) -> Result<()> {
self.err_callback.invoke(args)
}
pub(super) fn callback(&self) -> &Callback<CallbackInfo> {
&self.callback
}
pub(super) fn err_callback(&self) -> &Callback<Error> {
&self.err_callback
}
}
impl Default for SharedData {
fn default() -> Self {
Self::new()
}
}
impl Debug for SharedData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SharedData")
.field("controls", &self.controls)
.field("callback", &self.callback)
.field("err_callback", &self.err_callback)
.finish()
}
}