use std::fmt;
use types::{LengthUnit};
use {WriteOptions, FromStream, WriteBuffer, WriteToString};
use svgparser::Error as ParseError;
use svgparser::Stream;
#[derive(Clone,Copy,PartialEq,Debug)]
#[allow(missing_docs)]
pub struct Length {
pub num: f64,
pub unit: LengthUnit,
}
impl Length {
pub fn new(num: f64, unit: LengthUnit) -> Length {
Length {
num: num,
unit: unit,
}
}
}
impl FromStream for Length {
type Err = ParseError;
fn from_stream(mut s: Stream) -> Result<Length, ParseError> {
let l = try!(s.parse_length());
Ok(Length::new(l.num, l.unit))
}
}
impl WriteBuffer for Length {
fn write_buf_opt(&self, opt: &WriteOptions, buf: &mut Vec<u8>) {
self.num.write_buf_opt(opt, buf);
let t: &[u8] = match self.unit {
LengthUnit::None => b"",
LengthUnit::Em => b"em",
LengthUnit::Ex => b"ex",
LengthUnit::Px => b"px",
LengthUnit::In => b"in",
LengthUnit::Cm => b"cm",
LengthUnit::Mm => b"mm",
LengthUnit::Pt => b"pt",
LengthUnit::Pc => b"pc",
LengthUnit::Percent => b"%",
};
buf.extend_from_slice(t);
}
}
impl_display!(Length);
#[cfg(test)]
mod tests {
use super::*;
use types::{LengthUnit};
macro_rules! test_length {
($name:ident, $len:expr, $unit:expr, $result:expr) => (
#[test]
fn $name() {
let l = Length::new($len, $unit);
assert_eq!(l.to_string(), $result);
}
)
}
test_length!(gen_length_1, 1.0, LengthUnit::None, "1");
test_length!(gen_length_2, 1.0, LengthUnit::Em, "1em");
test_length!(gen_length_3, 1.0, LengthUnit::Ex, "1ex");
test_length!(gen_length_4, 1.0, LengthUnit::Px, "1px");
test_length!(gen_length_5, 1.0, LengthUnit::In, "1in");
test_length!(gen_length_6, 1.0, LengthUnit::Cm, "1cm");
test_length!(gen_length_7, 1.0, LengthUnit::Mm, "1mm");
test_length!(gen_length_8, 1.0, LengthUnit::Pt, "1pt");
test_length!(gen_length_9, 1.0, LengthUnit::Pc, "1pc");
test_length!(gen_length_10, 1.0, LengthUnit::Percent, "1%");
}