use tokenizer::{PeekableTokens, Token};
use FromTokens;
use Geometry;
#[derive(Default)]
pub struct GeometryCollection(pub Vec<Geometry>);
impl GeometryCollection {
pub fn as_item(self) -> Geometry {
Geometry::GeometryCollection(self)
}
}
impl FromTokens for GeometryCollection {
fn from_tokens(tokens: &mut PeekableTokens) -> Result<Self, &'static str> {
let mut items = Vec::new();
let word = match tokens.next() {
Some(Token::Word(w)) => w,
_ => return Err("Expected a word in GEOMETRYCOLLECTION")
};
let item = try!(Geometry::from_word_and_tokens(&*word, tokens));
items.push(item);
while let Some(&Token::Comma) = tokens.peek() {
tokens.next();
let word = match tokens.next() {
Some(Token::Word(w)) => w,
_ => return Err("Expected a word in GEOMETRYCOLLECTION")
};
let item = try!(Geometry::from_word_and_tokens(&*word, tokens));
items.push(item);
}
Ok(GeometryCollection(items))
}
}
#[cfg(test)]
mod tests {
use {Wkt, Geometry};
use super::GeometryCollection;
#[test]
fn basic_geometrycollection() {
let mut wkt = Wkt::from_str("GEOMETRYCOLLECTION (POINT (8 4)))").ok().unwrap();
assert_eq!(1, wkt.items.len());
let items = match wkt.items.pop().unwrap() {
Geometry::GeometryCollection(GeometryCollection(items)) => items,
_ => unreachable!(),
};
assert_eq!(1, items.len());
}
}