use std::ascii::AsciiExt;
use std::default::Default;
use tokenizer::{PeekableTokens, Token};
pub use self::coord::Coord;
pub use self::geometrycollection::GeometryCollection;
pub use self::linestring::LineString;
pub use self::point::Point;
pub use self::polygon::Polygon;
pub use self::multipoint::MultiPoint;
pub use self::multilinestring::MultiLineString;
pub use self::multipolygon::MultiPolygon;
mod coord;
mod geometrycollection;
mod point;
mod polygon;
mod linestring;
mod multipoint;
mod multilinestring;
mod multipolygon;
trait FromTokens: Sized+Default {
fn from_tokens(tokens: &mut PeekableTokens) -> Result<Self, &'static str>;
fn from_tokens_with_parens(tokens: &mut PeekableTokens) -> Result<Self, &'static str> {
match tokens.next() {
Some(Token::ParenOpen) => (),
Some(Token::Word(ref s)) if s.to_ascii_uppercase() == "EMPTY" =>
return Ok(Default::default()),
_ => return Err("Missing open parenthesis for type"),
};
let result = FromTokens::from_tokens(tokens);
match tokens.next() {
Some(Token::ParenClose) => (),
_ => return Err("Missing closing parenthesis for type"),
};
result
}
fn comma_many<F>(f: F, tokens: &mut PeekableTokens) -> Result<Vec<Self>, &'static str>
where F: Fn(&mut PeekableTokens) -> Result<Self, &'static str> {
let mut items = Vec::new();
match f(tokens) {
Ok(i) => items.push(i),
Err(s) => return Err(s),
};
while let Some(&Token::Comma) = tokens.peek() {
tokens.next();
match f(tokens) {
Ok(i) => items.push(i),
Err(s) => return Err(s),
};
}
Ok(items)
}
}