1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
use crate::{Point,Line,Area}; use desert::{FromBytesLE,ToBytesLE}; #[derive(Debug,Clone,PartialEq)] pub enum Feature { Point(Point), Line(Line), Area(Area) } pub fn decode(buf: &[u8]) -> Result<Feature,failure::Error> { Ok(Feature::from_bytes_le(buf)?.1) } impl FromBytesLE for Feature { fn from_bytes_le(buf: &[u8]) -> Result<(usize,Self),failure::Error> { if buf.is_empty() { failure::bail!["not enough bytes to decode feature"] } Ok(match buf[0] { 0x01 => { let (s,point) = Point::from_bytes_le(buf)?; (s,Feature::Point(point)) }, 0x02 => { let (s,line) = Line::from_bytes_le(buf)?; (s,Feature::Line(line)) }, 0x03 => { let (s,area) = Area::from_bytes_le(buf)?; (s,Feature::Area(area)) }, x => { failure::bail!["cannot decode feature type. expected 0x01, 0x02, or 0x03. \ received {}", x] } }) } } impl ToBytesLE for Feature { fn to_bytes_le(&self) -> Result<Vec<u8>,failure::Error> { match self { Self::Point(point) => point.to_bytes_le(), Self::Line(line) => line.to_bytes_le(), Self::Area(area) => area.to_bytes_le(), } } }