aria-core 0.1.0

Generic adaptive sequencing engine — zero dependencies, domain-agnostic. Suggest(), feedback(). Works from item one.
Documentation
use std::fmt;

#[derive(Debug, PartialEq)]
pub enum AriaError {
    /// No items registered in the engine
    NoItems,
    /// All items filtered out (prereqs, already seen, etc.)
    NoEligibleItems,
    /// User ID not found
    UserNotFound(String),
    /// Item ID not found
    ItemNotFound(String),
    /// Prerequisite graph contains a cycle
    CyclicPrerequisite(String),
    /// Factor list is empty — engine needs at least one factor
    NoFactors,
    /// Serialisation / deserialisation failure
    SerialisationError(String),
}

impl fmt::Display for AriaError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            AriaError::NoItems => write!(f, "No items registered"),
            AriaError::NoEligibleItems => write!(f, "No eligible items for this user"),
            AriaError::UserNotFound(id) => write!(f, "User not found: {id}"),
            AriaError::ItemNotFound(id) => write!(f, "Item not found: {id}"),
            AriaError::CyclicPrerequisite(id) => {
                write!(f, "Cyclic prerequisite detected at item: {id}")
            }
            AriaError::NoFactors => write!(f, "Engine has no factors registered"),
            AriaError::SerialisationError(msg) => write!(f, "Serialisation error: {msg}"),
        }
    }
}

impl std::error::Error for AriaError {}