use thiserror::Error;
#[derive(Error, Debug, Clone)]
pub enum UnitError {
#[error("cannot convert between incompatible dimensions: {from} -> {to}")]
DimensionMismatch {
from: String,
to: String,
},
#[error("cannot add/subtract quantities with different dimensions: {lhs} vs {rhs}")]
IncompatibleDimensions {
lhs: String,
rhs: String,
},
#[error("unknown unit: '{name}'{}",
if suggestions.is_empty() { String::new() }
else { format!(", did you mean '{}'?", suggestions.join("' or '")) }
)]
UnknownUnit {
name: String,
suggestions: Vec<String>,
},
#[error("failed to parse unit string: {0}")]
ParseError(String),
#[error("no equivalency found for conversion: {from} -> {to}")]
NoEquivalency {
from: String,
to: String,
},
#[error("cannot convert non-dimensionless quantity to scalar")]
NotDimensionless,
#[error("invalid operation on logarithmic unit: {0}")]
LogarithmicError(String),
#[error("overflow in dimension exponent calculation")]
DimensionOverflow,
#[error("zero denominator in rational exponent")]
ZeroDenominator,
#[error(
"cannot use simple scaling for offset units: {from} -> {to}, use Quantity::to() instead"
)]
OffsetConversion {
from: String,
to: String,
},
#[error("batch operation error: {0}")]
BatchError(String),
}
pub type UnitResult<T> = Result<T, UnitError>;