1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
//! C-compatible error type.
use crate::lib::fmt::{self, Display, Formatter};
#[cfg(feature = "std")]
use std::error::Error as StdError;
/// Error code, indicating failure type.
///
/// Error messages are designating by an error code of less than 0.
/// This is to be compatible with C conventions. This enumeration is
/// FFI-compatible for interfacing with C code.
///
/// # FFI
///
/// For interfacing with FFI-code, this may be approximated by:
/// ```text
/// const int32_t OVERFLOW = -1;
/// const int32_t UNDERFLOW = -2;
/// const int32_t INVALID_DIGIT = -3;
/// const int32_t EMPTY = -4;
/// const int32_t EMPTY_FRACTION = -5;
/// const int32_t EMPTY_EXPONENT = -6;
/// ```
///
/// # Safety
///
/// Assigning any value outside the range `[-6, -1]` to value of type
/// ErrorCode may invoke undefined-behavior.
#[repr(i32)]
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub enum ErrorCode {
/// Integral overflow occurred during numeric parsing.
///
/// Numeric overflow takes precedence over the presence of an invalid
/// digit.
Overflow = -1,
/// Integral underflow occurred during numeric parsing.
///
/// Numeric overflow takes precedence over the presence of an invalid
/// digit.
Underflow = -2,
/// Invalid digit found before string termination.
InvalidDigit = -3,
/// Empty byte array found.
Empty = -4,
/// Empty mantissa found.
EmptyMantissa = -5,
/// Empty exponent found.
EmptyExponent = -6,
/// Empty integer found.
EmptyInteger = -7,
/// Empty fraction found.
EmptyFraction = -8,
/// Invalid positive mantissa sign was found.
InvalidPositiveMantissaSign = -9,
/// Mantissa sign was required, but not found.
MissingMantissaSign = -10,
/// Exponent was present but not allowed.
InvalidExponent = -11,
/// Invalid positive exponent sign was found.
InvalidPositiveExponentSign = -12,
/// Exponent sign was required, but not found.
MissingExponentSign = -13,
/// Exponent was present without fraction component.
ExponentWithoutFraction = -14,
/// Integer had invalid leading zeros.
InvalidLeadingZeros = -15,
// We may add additional variants later, so ensure that client matching
// does not depend on exhaustive matching.
#[doc(hidden)]
__Nonexhaustive = -200,
}
/// Error type for lexical parsing.
///
/// This error is FFI-compatible for interfacing with C code.
#[repr(C)]
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub struct Error {
/// Error code designating the type of error occurred.
pub code: ErrorCode,
/// Optional position within the buffer for the error.
pub index: usize,
}
impl From<ErrorCode> for Error {
#[inline]
fn from(code: ErrorCode) -> Self {
Error { code: code, index: 0 }
}
}
impl From<(ErrorCode, usize)> for Error {
#[inline]
fn from(error: (ErrorCode, usize)) -> Self {
Error { code: error.0, index: error.1 }
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "lexical error: {:?} at index {}.", self.code, self.index)
}
}
#[cfg(feature = "std")]
impl StdError for Error {}