use tokenizer::PeekableTokens;
use FromTokens;
use types::coord::Coord;
use Geometry;
#[derive(Default)]
pub struct LineString(pub Vec<Coord>);
impl LineString {
pub fn as_item(self) -> Geometry {
Geometry::LineString(self)
}
}
impl FromTokens for LineString {
fn from_tokens(tokens: &mut PeekableTokens) -> Result<Self, &'static str> {
let result = FromTokens::comma_many(<Coord as FromTokens>::from_tokens, tokens);
result.map(|vec| LineString(vec))
}
}
#[cfg(test)]
mod tests {
use {Wkt, Geometry};
use super::LineString;
#[test]
fn basic_linestring() {
let mut wkt = Wkt::from_str("LINESTRING (10 -20, -0 -0.5)").ok().unwrap();
assert_eq!(1, wkt.items.len());
let coords = match wkt.items.pop().unwrap() {
Geometry::LineString(LineString(coords)) => coords,
_ => unreachable!(),
};
assert_eq!(2, coords.len());
assert_eq!(10.0, coords[0].x);
assert_eq!(-20.0, coords[0].y);
assert_eq!(None, coords[0].z);
assert_eq!(None, coords[0].m);
assert_eq!(0.0, coords[1].x);
assert_eq!(-0.5, coords[1].y);
assert_eq!(None, coords[1].z);
assert_eq!(None, coords[1].m);
}
}