#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CounterFault {
NotAnInteger,
NotAFloat,
IntegerOverflow,
NonFinite,
}
impl CounterFault {
pub fn message(self) -> &'static str {
match self {
Self::NotAnInteger => "value is not an integer or out of range",
Self::NotAFloat => "value is not a valid float",
Self::IntegerOverflow => "increment or decrement would overflow",
Self::NonFinite => "increment would produce NaN or Infinity",
}
}
pub fn is_out_of_range(self) -> bool {
matches!(self, Self::IntegerOverflow | Self::NonFinite)
}
pub fn sqlstate(self) -> &'static str {
use nodedb_types::error::sqlstate;
if self.is_out_of_range() {
sqlstate::NUMERIC_VALUE_OUT_OF_RANGE
} else {
sqlstate::INVALID_TEXT_REPRESENTATION
}
}
}
impl std::fmt::Display for CounterFault {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.message())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_faults_answer_invalid_text_representation() {
assert_eq!(CounterFault::NotAnInteger.sqlstate(), "22P02");
assert_eq!(CounterFault::NotAFloat.sqlstate(), "22P02");
}
#[test]
fn range_faults_answer_numeric_value_out_of_range() {
assert_eq!(CounterFault::IntegerOverflow.sqlstate(), "22003");
assert_eq!(CounterFault::NonFinite.sqlstate(), "22003");
}
}