use crate::MAX_PRIME_LIMIT;
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
pub enum PitchRatioError {
#[error("pitch ratios require positive numerator and denominator")]
NonPositiveRatio,
#[error("pitch ratio integer operation overflowed")]
Overflow,
#[error("factorization requires a bounded prime limit")]
UnboundedFactorization,
#[error("prime limit {0} is outside 2..={MAX_PRIME_LIMIT}")]
InvalidPrimeLimit(u32),
#[error(
"ratio has factors above prime limit {prime_limit}: remaining {remaining_numerator}/{remaining_denominator}"
)]
PrimeLimitExceeded {
remaining_numerator: u64,
remaining_denominator: u64,
prime_limit: u32,
},
#[error("prime exponent exceeded bounded rank domain")]
ExponentOverflow,
#[error("factor vector primes and exponents do not match")]
InvalidFactorVector,
#[error("factor exponent {exponent} is outside {min}..={max}")]
RankExponentOutOfRange {
exponent: i16,
min: i16,
max: i16,
},
#[error("discrete rank error: {0}")]
DiscreteRank(String),
#[error("ratio chord requires at least one ratio")]
EmptyChord,
#[error("ratio chord root index {root_index} is outside chord length {len}")]
InvalidRootIndex {
root_index: usize,
len: usize,
},
#[error("generalized mean exponent must be finite and non-zero")]
InvalidMeanExponent,
}