mod chain;
mod model;
mod queue;
mod stack;
use pyo3::{prelude::*, wrap_pymodule};
use std::prelude::v1::*;
use crate::{stream::TryCodingError, CoderError, DefaultEncoderFrontendError};
#[pymodule]
#[pyo3(name = "stream")]
pub fn init_module(module: &Bound<'_, PyModule>) -> PyResult<()> {
module.add_wrapped(wrap_pymodule!(model::init_module))?;
module.add_wrapped(wrap_pymodule!(queue::init_module))?;
module.add_wrapped(wrap_pymodule!(stack::init_module))?;
module.add_wrapped(wrap_pymodule!(chain::init_module))?;
Ok(())
}
impl<CodingError: Into<PyErr>, ModelError> From<TryCodingError<CodingError, ModelError>> for PyErr {
fn from(err: TryCodingError<CodingError, ModelError>) -> Self {
match err {
crate::stream::TryCodingError::CodingError(err) => err.into(),
crate::stream::TryCodingError::InvalidEntropyModel(_) => {
pyo3::exceptions::PyValueError::new_err("Invalid parameters for entropy model")
}
}
}
}
impl<FrontendError: Into<PyErr>, BackendError: Into<PyErr>>
From<CoderError<FrontendError, BackendError>> for PyErr
{
fn from(err: CoderError<FrontendError, BackendError>) -> Self {
match err {
CoderError::Frontend(err) => err.into(),
CoderError::Backend(err) => err.into(),
}
}
}
impl From<DefaultEncoderFrontendError> for PyErr {
fn from(err: DefaultEncoderFrontendError) -> Self {
match err {
DefaultEncoderFrontendError::ImpossibleSymbol => {
pyo3::exceptions::PyKeyError::new_err(err.to_string())
}
}
}
}