selene-core 0.4.2

selene-core is the backend for Selene, a local-first music player
Documentation
use std::path::PathBuf;

use image::ImageError;
use lofty::error::LoftyError;
use lunar_lib::database::{DatabaseError, TransactionError};
use thiserror::Error;

use crate::media_container::{Codec, ContainerFormat};

#[derive(Debug, Error)]
pub enum CodecError {
    #[error("Unknown or unsupported codec: {0}")]
    Unknown(String),

    #[error("Codec '{0:?}' is missing an encoder")]
    NoEncoder(Codec),

    #[error("A codec is missing a symphonia decoder")]
    NoDecoder,

    #[error("Codec '{0:?}' is an unsupported codec")]
    UnsupportedCodec(Codec),
}

#[derive(Debug, Error)]
pub enum ContainerError {
    #[error("IoError: {0}")]
    Io(#[from] std::io::Error),

    #[error("Codec Error: {0}")]
    Codec(#[from] CodecError),

    #[error("Symphonia Error: {0}")]
    Symphonia(#[from] symphonia::core::errors::Error),

    #[error("File '{0}' has no tracks/streams")]
    NoStream(PathBuf),

    #[error("File '{0}' has an unsupported container")]
    InvalidSource(PathBuf),

    #[error("'{0:?}' is an unsupported container")]
    UnsupportedContainer(ContainerFormat),

    #[error("Couldn't find sample rate")]
    NoSampleRate,

    #[error("Couldn't find channel count'")]
    NoChannelCount,
}

#[derive(Error, Debug)]
pub enum LibraryError {
    #[error(
        "Failed to update library because no library directory set (Try 'musicmanager library set --help)"
    )]
    NoLibrary,
}

#[derive(Debug, Error)]
pub enum ExtractError {
    #[error("IoError: {0}")]
    Io(#[from] std::io::Error),

    #[error("LoftyError: {0}")]
    Lofty(#[from] LoftyError),

    #[error("DatabaseError: {0}")]
    Database(#[from] DatabaseError),

    #[error("Transaction Error: {0}")]
    Transaction(#[from] TransactionError),

    #[error("Container Error: {0}")]
    Container(#[from] ContainerError),

    #[error("Format Error: {0}")]
    Format(#[from] lunar_lib::formatter::FormatError),

    #[error("InvalidContainer Error")]
    InvalidContainer,
}

#[derive(Debug, Error)]
pub enum OrphanRelinkError {
    #[error("IoError: {0}")]
    Io(#[from] std::io::Error),

    #[error("Database Error: {0}")]
    Database(#[from] DatabaseError),

    #[error("Transaction Error: {0}")]
    Transaction(#[from] TransactionError),

    #[error("Library Error: {0}")]
    Library(#[from] LibraryError),
}

#[derive(Debug, Error)]
pub enum ImportError {
    #[error("IoError: {0}")]
    Io(#[from] std::io::Error),

    #[error("Lofty Error: {0}")]
    Lofty(#[from] LoftyError),

    #[error("Codec Error: {0}")]
    Codec(#[from] CodecError),

    #[error("Database Error: {0}")]
    Database(#[from] DatabaseError),

    #[error("Transaction Error: {0}")]
    Transaction(#[from] TransactionError),

    #[error("Container Error: {0}")]
    Container(#[from] ContainerError),

    #[error("Metadata Error: {0}")]
    Metadata(#[from] MetadataError),

    #[error("Library Error: {0}")]
    Library(#[from] LibraryError),
}

#[derive(Debug, Error)]
pub enum MetadataError {
    #[error("IoError: {0}")]
    Io(#[from] std::io::Error),

    #[error("Database Error: {0}")]
    Database(#[from] DatabaseError),

    #[error("Transaction Error: {0}")]
    Transaction(#[from] TransactionError),

    #[error("Lofty Error: {0}")]
    Lofty(#[from] LoftyError),

    #[error("Image Error: {0}")]
    Image(#[from] ImageError),
}