mediapulse 0.1.8

A self-contained native media player built around mpv
use std::sync::Arc;

use mediapulse_core::backend::{
    BackendError, PlaybackBackend, PlaybackCommand, PlaybackSnapshot, PropertyUpdate, PropertyValue,
};

#[cfg(feature = "libmpv")]
use mediapulse_core::backend::LibmpvBackend;

pub struct AppState {
    backend: Arc<dyn PlaybackBackend>,
}

impl AppState {
    pub fn new(
        window_id: Option<i64>,
        _sidecar: Option<std::path::PathBuf>,
    ) -> Result<Self, BackendError> {
        #[cfg(feature = "libmpv")]
        let backend = match window_id {
            Some(window_id) => LibmpvBackend::new_with_window_id(window_id)?,
            None => LibmpvBackend::new()?,
        };

        #[cfg(all(not(feature = "libmpv"), feature = "sidecar"))]
        let backend = {
            let sidecar = _sidecar.ok_or(BackendError::NotReady)?;
            mediapulse_core::backend::SidecarBackend::new(sidecar)?
        };

        Ok(Self {
            backend: Arc::new(backend),
        })
    }

    #[cfg(test)]
    pub(crate) fn with_backend(backend: Arc<dyn PlaybackBackend>) -> Self {
        Self { backend }
    }

    pub fn backend_kind(&self) -> mediapulse_core::backend::BackendKind {
        self.backend.backend_kind()
    }

    pub fn load(&self, source: &str) -> Result<(), BackendError> {
        self.backend.load(source)
    }

    pub fn command(&self, command: PlaybackCommand) -> Result<(), BackendError> {
        self.backend.command(command)
    }

    pub fn set_property(&self, update: PropertyUpdate) -> Result<(), BackendError> {
        self.backend.set_property(update)
    }

    pub fn get_property(&self, name: &str) -> Result<PropertyValue, BackendError> {
        self.backend.get_property(name)
    }

    pub fn snapshot(&self) -> Result<PlaybackSnapshot, BackendError> {
        self.backend.snapshot()
    }
}