//! Error types local to the `v1` protocol implementation

/// Protocol-specific ways a solution can fail verification
#[derive(Clone, Debug, thiserror::Error)]
#[non_exhaustive]
pub enum SolutionError {
    /// Mismatch between [`super::SeedHead`] and [`super::Instance`]
    #[error("Solution has an unrecognized Seed value")]
    Seed,
    /// The effort constraint `H(challenge | proof) * effort` failed.
    #[error("Failed to verify solution effort")]
    Effort,
    /// The Equi-X proof is not well-formed, it failed at least one order test.
    #[error("Failed to verify order of Equi-X proof")]
    Order,
    /// The Equi-X proof does not apply to this particular challenge.
    #[error("Failed to verify hash sums for Equi-X proof")]
    HashSum,
    /// Couldn't construct the HashX function
    ///
    /// A working solver should have rejected this [`super::Nonce`] value.
    #[error("Solution requires a challenge string that fails HashX constraints")]
    ChallengeConstraints,
}

/// Protocol-specific runtime errors
#[derive(Clone, Debug, thiserror::Error)]
#[non_exhaustive]
pub enum RuntimeError {
    /// Unexpected error or runtime compiler error from the Equi-X layer
    #[error("Equi-X error, {0}")]
    EquiX(#[from] equix::Error),
}
