spice-client 0.2.0

A pure Rust SPICE client library with native and WebAssembly support
use crate::error::SpiceError;
use std::error::Error;
use std::fmt;

pub mod audio;
pub mod display;
pub mod input;
pub mod spice_adapter;

#[cfg(test)]
mod tests;

#[cfg(feature = "backend-gtk4")]
pub mod gtk4;

#[cfg(target_arch = "wasm32")]
pub mod wasm;

#[derive(Debug)]
pub struct MultimediaError {
    message: String,
}

impl fmt::Display for MultimediaError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "Multimedia error: {}", self.message)
    }
}

impl Error for MultimediaError {}

impl MultimediaError {
    pub fn new(message: impl Into<String>) -> Self {
        Self {
            message: message.into(),
        }
    }
}

impl From<SpiceError> for MultimediaError {
    fn from(err: SpiceError) -> Self {
        Self {
            message: format!("SPICE error: {err}"),
        }
    }
}

pub type Result<T> = std::result::Result<T, MultimediaError>;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AudioSpec {
    pub frequency: u32,
    pub channels: u8,
    pub samples: u16,
}

impl Default for AudioSpec {
    fn default() -> Self {
        Self {
            frequency: 44100,
            channels: 2,
            samples: 4096,
        }
    }
}

pub trait MultimediaBackend {
    type Display: display::Display + Send;
    type Audio: audio::AudioOutput + Send;
    type Input: input::InputHandler + Send;

    fn create_display(&self) -> Result<Self::Display>;
    fn create_audio(&self) -> Result<Self::Audio>;
    fn create_input(&self) -> Result<Self::Input>;
}

#[cfg(feature = "backend-gtk4")]
pub fn create_default_backend() -> Result<impl MultimediaBackend> {
    gtk4::Gtk4Backend::new()
}

#[cfg(all(target_arch = "wasm32", not(feature = "backend-gtk4")))]
pub fn create_default_backend() -> Result<impl MultimediaBackend> {
    wasm::WasmBackend::new()
}