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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
// Copyright 2018 Evgeniy Reizner
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::str::FromStr;
use {
Error,
Length,
Result,
Stream,
WriteBuffer,
WriteOptions,
};
/// Representation of the [`<list-of-length>`] type.
///
/// [`<list-of-length>`]: https://www.w3.org/TR/SVG11/types.html#DataTypeList
#[derive(Clone, PartialEq)]
pub struct LengthList(pub Vec<Length>);
impl_from_vec!(LengthList, LengthList, Length);
impl_vec_defer!(LengthList, Length);
impl_display!(LengthList);
impl_debug_from_display!(LengthList);
/// A pull-based [`<list-of-length>`] parser.
///
/// # Example
///
/// ```rust
/// use svgtypes::{Length, LengthUnit, LengthListParser};
///
/// let mut p = LengthListParser::from("10px 20% 50mm");
/// assert_eq!(p.next().unwrap().unwrap(), Length::new(10.0, LengthUnit::Px));
/// assert_eq!(p.next().unwrap().unwrap(), Length::new(20.0, LengthUnit::Percent));
/// assert_eq!(p.next().unwrap().unwrap(), Length::new(50.0, LengthUnit::Mm));
/// assert_eq!(p.next().is_none(), true);
/// ```
///
/// [`<list-of-length>`]: https://www.w3.org/TR/SVG11/types.html#DataTypeList
#[derive(Clone, Copy, PartialEq, Debug)]
pub struct LengthListParser<'a>(Stream<'a>);
impl<'a> From<&'a str> for LengthListParser<'a> {
fn from(v: &'a str) -> Self {
LengthListParser(Stream::from(v))
}
}
impl<'a> Iterator for LengthListParser<'a> {
type Item = Result<Length>;
fn next(&mut self) -> Option<Self::Item> {
if self.0.at_end() {
None
} else {
let v = self.0.parse_list_length();
if v.is_err() {
self.0.jump_to_end();
}
Some(v)
}
}
}
impl FromStr for LengthList {
type Err = Error;
fn from_str(text: &str) -> Result<Self> {
let mut vec = Vec::new();
for number in LengthListParser::from(text) {
vec.push(number?);
}
Ok(LengthList(vec))
}
}