mod airspace;
mod altitude_limit;
mod altitude_reference;
mod altitude_unit;
mod category;
mod error;
mod file;
mod geometry;
mod point;
mod xml;
use std::convert::TryFrom;
use minidom::{Element, NSChoice};
pub use crate::airspace::Airspace;
pub use crate::altitude_limit::AltitudeLimit;
pub use crate::altitude_reference::AltitudeReference;
pub use crate::altitude_unit::AltitudeUnit;
pub use crate::category::Category;
pub use crate::error::Error;
pub use crate::file::File;
use crate::file::File as OpenAipFile;
pub use crate::geometry::Geometry;
pub use crate::point::Point;
use crate::xml::ElementExt;
pub fn parse(str: &str) -> Result<OpenAipFile, Error> {
let dom = str.parse::<Element>()?;
if dom.name() != "OPENAIP" {
return Err(Error::MissingElement("OPENAIP"));
}
let data_format_version = dom.get_attr("DATAFORMAT")?;
if data_format_version != "1.1" {
return Err(Error::IncompatibleDataFormatVersion(
data_format_version.to_string(),
));
}
let file = OpenAipFile {
airspaces: dom
.get_child("AIRSPACES", NSChoice::None)
.map(|e| e.children().map(Airspace::try_from).collect()),
};
Ok(file)
}