kira-spliceqc 0.2.0

Deterministic, explainable splicing QC for single-cell expression data.
Documentation
use std::path::PathBuf;

#[derive(Debug, thiserror::Error)]
pub enum InputError {
    #[error("unsupported input: {0}")]
    UnsupportedInput(String),
    #[error("missing file: {0}")]
    MissingFile(String),
    #[error("invalid MatrixMarket header")]
    InvalidMatrixMarket,
    #[error("expected coordinate sparse MatrixMarket, found {0}")]
    InvalidMatrixMarketType(String),
    #[error("features.tsv must have at least 2 columns")]
    InvalidFeaturesFormat,
    #[error("features.tsv contains empty gene symbol on line {0}")]
    EmptyGeneSymbol(usize),
    #[error("barcodes.tsv must have one column")]
    InvalidBarcodesFormat,
    #[error("barcodes.tsv contains empty entry on line {0}")]
    EmptyBarcode(usize),
    #[error("dimension mismatch: expected {expected}, found {found}")]
    DimensionMismatch { expected: String, found: String },
    #[error("matrix dimensions exceed u32::MAX: genes={n_genes}, cells={n_cells}")]
    DimensionTooLarge { n_genes: usize, n_cells: usize },
    #[error("invalid matrix dimensions")]
    InvalidMatrixDimensions,
    #[error("missing gene symbols")]
    MissingGeneSymbols,
    #[error("geneset catalog missing: {0}")]
    GenesetCatalogMissing(String),
    #[error("invalid geneset catalog: {0}")]
    InvalidGenesetCatalog(String),
    #[error("empty regulator gene set")]
    EmptyRegulatorSet,
    #[error("insufficient core spliceosome genesets")]
    InsufficientCoreGenesets,
    #[error("insufficient core genesets for imbalance")]
    InsufficientCoreGenesetsImbalance,
    #[error("length mismatch: {0}")]
    LengthMismatch(String),
    #[error("output serialization error: {0}")]
    OutputSerialization(String),
    #[error("empty transcription coupling geneset")]
    EmptyCouplingGeneset,
    #[error("insufficient genesets for exon/intron bias")]
    InsufficientGenesetsExonIntron,
    #[error("insufficient assembly phase genesets")]
    InsufficientAssemblyPhaseGenesets,
    #[error("missing cryptic splicing risk signals")]
    MissingCrypticRiskSignals,
    #[error("missing spliceosome collapse signals")]
    MissingCollapseSignals,
    #[error("missing timecourse signals")]
    MissingTimecourseSignals,
    #[error("insufficient splicing noise genesets")]
    InsufficientSplicingNoiseGenesets,
    #[error("unsupported h5ad layout")]
    UnsupportedH5ADLayout,
    #[error("invalid sparse matrix")]
    InvalidSparseMatrix,
    #[error("invalid shared cache: {0}")]
    InvalidSharedCache(String),
    #[error("gene index overflow")]
    GeneIndexOverflow,
    #[error("cell index overflow")]
    CellIndexOverflow,
    #[error("missing dataset: {0}")]
    MissingDataset(String),
    #[error("io error at {path}: {source}")]
    Io {
        path: PathBuf,
        source: std::io::Error,
    },
}

impl InputError {
    pub fn io(path: impl Into<PathBuf>, source: std::io::Error) -> Self {
        Self::Io {
            path: path.into(),
            source,
        }
    }
}