use nom::Err;
mod parsers;
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub struct Date {
pub year: i32,
pub month: Option<u32>,
pub day: Option<u32>,
}
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub struct Time {
pub hours: u32,
pub minutes: Option<u32>,
pub seconds: Option<u32>,
pub tz_offset_hours: Option<i32>,
pub tz_offset_minutes: Option<i32>,
}
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub struct Simple {
pub date: Date,
pub time: Option<Time>,
pub approximate: bool,
}
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub struct DateTime {
pub date: Date,
pub time: Option<Time>,
}
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub struct Duration {
pub years: u32,
pub months: u32,
pub days: u32,
pub hours: u32,
pub minutes: u32,
pub seconds: u32,
}
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub enum DateTimeOrDuration {
DateTime(DateTime),
Duration(Duration),
}
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub struct Range {
pub start: Option<DateTime>,
pub end: Option<DateTimeOrDuration>,
pub approximate: bool,
}
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub struct Recurring {
pub start: DateTime,
pub end: DateTimeOrDuration,
pub count: Option<u32>,
}
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub enum GedcomxDate {
Simple(Simple),
Range(Range),
Recurring(Recurring),
}
impl GedcomxDate {
pub fn get_simple_date(&self) -> Option<Simple> {
match *self {
GedcomxDate::Simple(date) => Some(date),
_ => None,
}
}
pub fn get_range(&self) -> Option<Range> {
match *self {
GedcomxDate::Range(date) => Some(date),
_ => None,
}
}
pub fn get_recurring(&self) -> Option<Recurring> {
match *self {
GedcomxDate::Recurring(date) => Some(date),
_ => None,
}
}
}
pub fn parse(string: &str) -> Result<GedcomxDate, String> {
match parsers::parse(string) {
Ok((remaining, parsed)) => {
if remaining.is_empty() {
Ok(parsed)
} else {
Err("Parsing error".to_string())
}
}
Err(Err::Incomplete(_)) => Err("Parsing error".to_string()),
Err(Err::Error(_)) => Err("Parsing error".to_string()),
Err(Err::Failure(_)) => Err("Parsing error".to_string()),
}
}