#![allow(missing_docs)]
use nom::Finish;
mod calendar;
pub(crate) mod components;
mod parameters;
mod parsed_string;
mod properties;
#[cfg(test)]
mod tests;
mod utils;
pub use calendar::Calendar;
pub use components::Component;
use nom_language::error::{VerboseError, convert_error};
pub use parameters::Parameter;
pub use parsed_string::ParseString;
pub use properties::Property;
use components::*;
pub use utils::unfold;
pub fn read_calendar_simple(input: &str) -> Result<Vec<Component<'_>>, nom::error::Error<&str>> {
components(input).finish().map(|(_, components)| components)
}
pub fn read_calendar(input: &str) -> Result<Calendar<'_>, String> {
components(input)
.finish()
.map(|(_, mut components)| {
let root_is_calendar = components
.first()
.map(|first_root| first_root.name == "VCALENDAR")
.unwrap_or(false);
if root_is_calendar {
let root = components.swap_remove(0);
Calendar {
properties: root.properties,
components: root.components,
}
} else {
Calendar {
components,
properties: Vec::new(),
}
}
})
.map_err(|e: VerboseError<&str>| format!("error: {}", convert_error(input, e.clone())))
}
#[test]
fn begin_crash() {
assert!(read_calendar("BEGIN:").is_err());
}
pub fn read_components(input: &str) -> Result<Vec<Component<'_>>, String> {
components(input)
.finish()
.map(|(_, components)| components)
.map_err(|e: VerboseError<&str>| format!("error: {}", convert_error(input, e.clone())))
}