#![doc = include_str ! ("../README.md")]
extern crate core;
extern crate strum;
use strum::{Display, EnumMessage};
mod config;
mod date;
mod datetime;
mod duration;
mod numbers;
mod time;
mod util;
pub use config::{
DateConfig, DateConfigBuilder, DateTimeConfig, DateTimeConfigBuilder, TimeConfig, TimeConfigBuilder, TimestampUnit,
};
pub use date::Date;
pub use datetime::DateTime;
pub use duration::Duration;
pub use time::{MicrosecondsPrecisionOverflowBehavior, Time};
pub use numbers::{float_parse_bytes, float_parse_str, int_parse_bytes, int_parse_str, IntFloat};
macro_rules! get_digit {
($bytes:ident, $index:expr, $error:ident) => {
match $bytes.get($index) {
Some(c) if c.is_ascii_digit() => c - b'0',
_ => return Err(ParseError::$error),
}
};
}
pub(crate) use get_digit;
macro_rules! get_digit_unchecked {
($bytes:ident, $index:expr, $error:ident) => {
match $bytes.get_unchecked($index) {
c if c.is_ascii_digit() => c - b'0',
_ => return Err(ParseError::$error),
}
};
}
pub(crate) use get_digit_unchecked;
#[derive(Debug, Display, EnumMessage, PartialEq, Eq, Clone)]
#[strum(serialize_all = "snake_case")]
pub enum ParseError {
TooShort,
ExtraCharacters,
InvalidCharDateTimeSep,
InvalidCharDateSep,
DateNotExact,
InvalidCharYear,
InvalidCharMonth,
InvalidCharDay,
InvalidCharTimeSep,
InvalidCharHour,
InvalidCharMinute,
InvalidCharSecond,
InvalidCharSecondFraction,
InvalidCharTzSign,
InvalidCharTzHour,
InvalidCharTzMinute,
OutOfRangeTzMinute,
OutOfRangeTz,
TzRequired,
SystemTimeError,
OutOfRangeMonth,
OutOfRangeDay,
OutOfRangeHour,
OutOfRangeMinute,
OutOfRangeSecond,
SecondFractionTooLong,
SecondFractionMissing,
MillisecondFractionTooLong,
DurationInvalidNumber,
DurationTRepeated,
DurationInvalidFraction,
DurationInvalidTimeUnit,
DurationInvalidDateUnit,
DurationInvalidDays,
DurationValueTooLarge,
DurationHourValueTooLarge,
DurationDaysTooLarge,
DateTooSmall,
DateTooLarge,
TimeTooLarge,
}
#[derive(Debug, Display, EnumMessage, PartialEq, Eq, Clone)]
#[strum(serialize_all = "snake_case")]
pub enum ConfigError {
UnknownMicrosecondsPrecisionOverflowBehaviorString,
UnknownTimestampUnitString,
}
fn display_num_buf(num: usize, start: usize, value: u32, buf: &mut [u8]) {
for i in 0..num {
if (i + 1) == num {
buf[i + start] = b'0' + (value % 10) as u8;
} else if num <= 2 {
buf[i + start] = b'0' + (value / (10i32.pow((num - 1 - i) as u32)) as u32) as u8;
} else {
buf[i + start] = b'0' + (value / (10i32.pow((num - 1 - i) as u32)) as u32 % 10) as u8;
}
}
}