[librsvg: 15/30] parsers: move NumberList together with the rest of the helpers




commit 390756b943fb5a55fced699331cc0896824a5afe
Author: Paolo Borelli <pborelli gnome org>
Date:   Wed Dec 23 23:02:13 2020 +0100

    parsers: move NumberList together with the rest of the helpers

 Makefile.am                       |   1 -
 po/POTFILES.in                    |   1 -
 src/filters/color_matrix.rs       |   3 +-
 src/filters/component_transfer.rs |   3 +-
 src/filters/convolve_matrix.rs    |   5 +-
 src/lib.rs                        |   1 -
 src/number_list.rs                | 121 --------------------------------------
 src/parsers.rs                    | 111 ++++++++++++++++++++++++++++++++++
 src/viewbox.rs                    |   3 +-
 9 files changed, 117 insertions(+), 132 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index d9204fd5..376be0f3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -85,7 +85,6 @@ LIBRSVG_SRC =                                 \
        src/log.rs                              \
        src/marker.rs                           \
        src/node.rs                             \
-       src/number_list.rs                      \
        src/paint_server.rs                     \
        src/parsers.rs                          \
        src/path_builder.rs                     \
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 2068ce15..ce96f82e 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -56,7 +56,6 @@ src/limits.rs
 src/log.rs
 src/marker.rs
 src/node.rs
-src/number_list.rs
 src/paint_server.rs
 src/parsers.rs
 src/path_builder.rs
diff --git a/src/filters/color_matrix.rs b/src/filters/color_matrix.rs
index c95aa7ec..97b09cf2 100644
--- a/src/filters/color_matrix.rs
+++ b/src/filters/color_matrix.rs
@@ -8,8 +8,7 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::element::{ElementResult, SetAttributes};
 use crate::error::*;
 use crate::node::Node;
-use crate::number_list::{NumberList, NumberListLength};
-use crate::parsers::{Parse, ParseValue};
+use crate::parsers::{NumberList, NumberListLength, Parse, ParseValue};
 use crate::surface_utils::{
     iterators::Pixels, shared_surface::ExclusiveImageSurface, ImageSurfaceDataExt, Pixel,
 };
diff --git a/src/filters/component_transfer.rs b/src/filters/component_transfer.rs
index 89e81238..dad54411 100644
--- a/src/filters/component_transfer.rs
+++ b/src/filters/component_transfer.rs
@@ -9,8 +9,7 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::element::{Draw, Element, ElementResult, SetAttributes};
 use crate::error::*;
 use crate::node::{Node, NodeBorrow};
-use crate::number_list::{NumberList, NumberListLength};
-use crate::parsers::{Parse, ParseValue};
+use crate::parsers::{NumberList, NumberListLength, Parse, ParseValue};
 use crate::surface_utils::{
     iterators::Pixels, shared_surface::ExclusiveImageSurface, ImageSurfaceDataExt, Pixel,
 };
diff --git a/src/filters/convolve_matrix.rs b/src/filters/convolve_matrix.rs
index 98366123..10298e73 100644
--- a/src/filters/convolve_matrix.rs
+++ b/src/filters/convolve_matrix.rs
@@ -8,8 +8,9 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::element::{ElementResult, SetAttributes};
 use crate::error::*;
 use crate::node::Node;
-use crate::number_list::{NumberList, NumberListLength};
-use crate::parsers::{NonNegative, NumberOptionalNumber, Parse, ParseValue};
+use crate::parsers::{
+    NonNegative, NumberList, NumberListLength, NumberOptionalNumber, Parse, ParseValue,
+};
 use crate::rect::IRect;
 use crate::surface_utils::{
     iterators::{PixelRectangle, Pixels},
diff --git a/src/lib.rs b/src/lib.rs
index 159c6322..1cff576b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -116,7 +116,6 @@ mod iri;
 mod length;
 mod limits;
 mod marker;
-mod number_list;
 mod paint_server;
 mod path_builder;
 mod path_parser;
diff --git a/src/parsers.rs b/src/parsers.rs
index c0507b93..6b138149 100644
--- a/src/parsers.rs
+++ b/src/parsers.rs
@@ -131,6 +131,69 @@ impl Parse for u32 {
     }
 }
 
+#[derive(Eq, PartialEq)]
+pub enum NumberListLength {
+    Exact(usize),
+    Unbounded,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct NumberList(pub Vec<f64>);
+
+/// CSS number-list values.
+impl NumberList {
+    pub fn parse<'i>(
+        parser: &mut Parser<'i, '_>,
+        length: NumberListLength,
+    ) -> Result<Self, ParseError<'i>> {
+        let mut v = match length {
+            NumberListLength::Exact(l) if l > 0 => Vec::<f64>::with_capacity(l),
+            NumberListLength::Exact(_) => unreachable!("NumberListLength::Exact cannot be 0"),
+            NumberListLength::Unbounded => Vec::<f64>::new(),
+        };
+
+        if parser.is_exhausted() && length == NumberListLength::Unbounded {
+            return Ok(NumberList(v));
+        }
+
+        for i in 0.. {
+            if i != 0 {
+                optional_comma(parser);
+            }
+
+            v.push(f64::parse(parser)?);
+
+            if let NumberListLength::Exact(l) = length {
+                if i + 1 == l {
+                    break;
+                }
+            }
+
+            if parser.is_exhausted() {
+                match length {
+                    NumberListLength::Exact(l) => {
+                        if i + 1 == l {
+                            break;
+                        }
+                    }
+                    _ => break,
+                }
+            }
+        }
+
+        Ok(NumberList(v))
+    }
+
+    pub fn parse_str(s: &str, length: NumberListLength) -> Result<NumberList, ParseError<'_>> {
+        let mut input = ParserInput::new(s);
+        let mut parser = Parser::new(&mut input);
+
+        let res = Self::parse(&mut parser, length)?;
+        parser.expect_exhausted()?;
+        Ok(res)
+    }
+}
+
 /// Parses a list of identifiers from a `cssparser::Parser`
 ///
 /// # Example
@@ -302,6 +365,54 @@ mod tests {
         assert!(NumberOptionalNumber::<i32>::parse_str("1, 2.5").is_err());
     }
 
+    #[test]
+    fn parses_number_list() {
+        assert_eq!(
+            NumberList::parse_str("5", NumberListLength::Exact(1)).unwrap(),
+            NumberList(vec![5.0])
+        );
+
+        assert_eq!(
+            NumberList::parse_str("1 2 3 4", NumberListLength::Exact(4)).unwrap(),
+            NumberList(vec![1.0, 2.0, 3.0, 4.0])
+        );
+
+        assert_eq!(
+            NumberList::parse_str("", NumberListLength::Unbounded).unwrap(),
+            NumberList(vec![])
+        );
+
+        assert_eq!(
+            NumberList::parse_str("1, 2, 3.0, 4, 5", NumberListLength::Unbounded).unwrap(),
+            NumberList(vec![1.0, 2.0, 3.0, 4.0, 5.0])
+        );
+    }
+
+    #[test]
+    fn errors_on_invalid_number_list() {
+        // empty
+        assert!(NumberList::parse_str("", NumberListLength::Exact(1)).is_err());
+
+        // garbage
+        assert!(NumberList::parse_str("foo", NumberListLength::Exact(1)).is_err());
+        assert!(NumberList::parse_str("1foo", NumberListLength::Exact(2)).is_err());
+        assert!(NumberList::parse_str("1 foo", NumberListLength::Exact(2)).is_err());
+        assert!(NumberList::parse_str("1 foo 2", NumberListLength::Exact(2)).is_err());
+        assert!(NumberList::parse_str("1,foo", NumberListLength::Exact(2)).is_err());
+
+        // too many
+        assert!(NumberList::parse_str("1 2", NumberListLength::Exact(1)).is_err());
+
+        // extra token
+        assert!(NumberList::parse_str("1,", NumberListLength::Exact(1)).is_err());
+        assert!(NumberList::parse_str("1,", NumberListLength::Exact(1)).is_err());
+        assert!(NumberList::parse_str("1,", NumberListLength::Unbounded).is_err());
+
+        // too few
+        assert!(NumberList::parse_str("1", NumberListLength::Exact(2)).is_err());
+        assert!(NumberList::parse_str("1 2", NumberListLength::Exact(3)).is_err());
+    }
+
     #[test]
     fn parses_custom_ident() {
         assert_eq!(
diff --git a/src/viewbox.rs b/src/viewbox.rs
index 5c4691e2..b979f216 100644
--- a/src/viewbox.rs
+++ b/src/viewbox.rs
@@ -4,8 +4,7 @@ use cssparser::Parser;
 use std::ops::Deref;
 
 use crate::error::*;
-use crate::number_list::{NumberList, NumberListLength};
-use crate::parsers::Parse;
+use crate::parsers::{NumberList, NumberListLength, Parse};
 use crate::rect::Rect;
 
 /// Newtype around a [`Rect`], used to represent the `viewBox` attribute.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]