#![doc = include_str!("../README.md")]
mod combined;
mod components;
mod parse;
mod parse_utils;
use components::SimpleYear;
pub use components::{
Day, Hour, Minute, Month, Nanosecond, Second, Year, ExtendedYear,
};
pub use combined::{
LocalDate, LocalDateTime, LocalTime, PreciseLocalDateTime, PreciseLocalTime,
PreciseShiftedDateTime, ShiftedDateTime,
};
pub use parse::Builder;
pub mod duration;
#[derive(Debug)]
#[non_exhaustive]
pub struct Error<'a, Y = SimpleYear> {
pub kind: ErrorKind<'a, Y>,
}
#[derive(Debug)]
pub enum ErrorKind<'a, Y = SimpleYear> {
ParseError(parse_utils::ParseError<'a>),
BuildError(parse::BuildError<Y>),
}
impl<'a, Y> From<parse::BuildError<Y>> for Error<'a, Y> {
fn from(value: parse::BuildError<Y>) -> Self {
Error {
kind: ErrorKind::BuildError(value),
}
}
}
impl<'a> From<parse_utils::ParseError<'a>> for Error<'a> {
fn from(value: parse_utils::ParseError<'a>) -> Self {
Error {
kind: ErrorKind::ParseError(value),
}
}
}
pub fn parse_rfc3339_datetime(inp: &str) -> Result<PreciseShiftedDateTime, Error<'_>> {
let mut parser = parse::ParseContext::new_rfc3339().into_parser();
parser.parse_precise_shifted_date_time(inp.as_bytes())?;
Ok(parser.build_precise_shifted_date_time()?)
}
pub fn parse_rfc3339_date(inp: &str) -> Result<LocalDate, Error<'_>> {
let mut parser = parse::ParseContext::new_rfc3339().into_parser();
parser.parse_date(inp.as_bytes())?;
Ok(parser.build_date()?)
}
pub fn parse_rfc3339_time(inp: &str) -> Result<PreciseLocalTime, Error<'_>> {
let mut parser = parse::ParseContext::new_rfc3339().into_parser();
parser.parse_precise_local_time(inp.as_bytes())?;
Ok(parser.build_precise_local_time()?)
}
#[cfg(test)]
mod test_parse_rfc3339_datetime {
use crate::{parse_rfc3339_datetime, parse_rfc3339_time};
#[test]
fn parse_all_datetime_from_file() {
let datafile = include_str!("../data/datetime-test-values-rfc.txt");
for line in datafile.lines() {
let dt = parse_rfc3339_datetime(line);
assert!(dt.is_ok(), "{}: {:?}", line, dt);
}
}
#[test]
fn parse_all_time_from_file() {
let datafile = include_str!("../data/time-test-values-rfc.txt");
for line in datafile.lines() {
let dt = parse_rfc3339_time(line);
assert!(dt.is_ok(), "{}: {:?}", line, dt);
}
}
}