[librsvg: 21/43] Convert Matrix to CssParseError



commit fcea36d2dd712f71a02e862e59614e99a4373c0f
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Dec 20 13:11:48 2019 -0600

    Convert Matrix to CssParseError

 rsvg_internals/src/gradient.rs  |  2 +-
 rsvg_internals/src/node.rs      |  4 +--
 rsvg_internals/src/pattern.rs   |  2 +-
 rsvg_internals/src/transform.rs | 57 +++++++++++++++++------------------------
 4 files changed, 28 insertions(+), 37 deletions(-)
---
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index 97cfcef8..669a97ff 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -549,7 +549,7 @@ impl Common {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "gradientUnits") => self.units = Some(attr.parse(value)?),
-                expanded_name!(svg "gradientTransform") => self.affine = Some(attr.parse(value)?),
+                expanded_name!(svg "gradientTransform") => self.affine = 
Some(attr.parse_to_parse_error(value)?),
                 expanded_name!(svg "spreadMethod") => self.spread = Some(attr.parse(value)?),
                 expanded_name!(xlink "href") => {
                     self.fallback = Some(Fragment::parse(value).attribute(attr)?)
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index b3dd0130..feb5d5a5 100644
--- a/rsvg_internals/src/node.rs
+++ b/rsvg_internals/src/node.rs
@@ -25,7 +25,7 @@ use crate::css::Declaration;
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::filters::FilterEffect;
-use crate::parsers::Parse;
+use crate::parsers::ParseToParseError;
 use crate::properties::{ComputedValues, SpecifiedValue, SpecifiedValues};
 use crate::property_bag::PropertyBag;
 use crate::property_defs::Overflow;
@@ -155,7 +155,7 @@ impl NodeData {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "transform") => {
-                    return Matrix::parse_str(value).attribute(attr).and_then(|affine| {
+                    return Matrix::parse_str_to_parse_error(value).attribute(attr).and_then(|affine| {
                         self.transform = affine;
                         Ok(())
                     });
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index dac6f94c..d7665d67 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -129,7 +129,7 @@ impl NodeTrait for Pattern {
                     self.common.preserve_aspect_ratio = Some(attr.parse(value)?)
                 }
                 expanded_name!(svg "patternTransform") => {
-                    self.common.affine = Some(attr.parse(value)?)
+                    self.common.affine = Some(attr.parse_to_parse_error(value)?)
                 }
                 expanded_name!(xlink "href") => {
                     self.fallback = Some(Fragment::parse(value).attribute(attr)?);
diff --git a/rsvg_internals/src/transform.rs b/rsvg_internals/src/transform.rs
index 6d67ebd5..5abd9a03 100644
--- a/rsvg_internals/src/transform.rs
+++ b/rsvg_internals/src/transform.rs
@@ -7,17 +7,21 @@ use std::f64::consts::*;
 use cssparser::{self, Parser, Token};
 
 use crate::error::*;
-use crate::parsers::{optional_comma, Parse, ParseToParseError};
+use crate::parsers::{optional_comma, ParseToParseError};
 
-impl Parse for cairo::Matrix {
-    fn parse(parser: &mut Parser<'_, '_>) -> Result<cairo::Matrix, ValueErrorKind> {
-        let matrix =
-            parse_transform_list(parser).map_err(|_| ValueErrorKind::parse_error("parse error"))?;
+impl ParseToParseError for cairo::Matrix {
+    fn parse_to_parse_error<'i>(
+        parser: &mut Parser<'i, '_>,
+    ) -> Result<cairo::Matrix, CssParseError<'i>> {
+        let loc = parser.current_source_location();
 
-        matrix
-            .try_invert()
-            .map(|_| matrix)
-            .map_err(|_| ValueErrorKind::Value("invalid transformation matrix".to_string()))
+        let matrix = parse_transform_list(parser)?;
+
+        matrix.try_invert().map(|_| matrix).map_err(|_| {
+            loc.new_custom_error(ValueErrorKind::Value(
+                "invalid transformation matrix".to_string(),
+            ))
+        })
     }
 }
 
@@ -25,7 +29,9 @@ impl Parse for cairo::Matrix {
 // Its operataion and grammar are described here:
 // https://www.w3.org/TR/SVG/coords.html#TransformAttribute
 
-fn parse_transform_list<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
+fn parse_transform_list<'i>(
+    parser: &mut Parser<'i, '_>,
+) -> Result<cairo::Matrix, CssParseError<'i>> {
     let mut matrix = cairo::Matrix::identity();
 
     loop {
@@ -101,7 +107,9 @@ fn parse_matrix_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, C
     })
 }
 
-fn parse_translate_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
+fn parse_translate_args<'i>(
+    parser: &mut Parser<'i, '_>,
+) -> Result<cairo::Matrix, CssParseError<'i>> {
     parser.parse_nested_block(|p| {
         let tx = f64::parse_to_parse_error(p)?;
 
@@ -191,8 +199,8 @@ mod tests {
     use float_cmp::ApproxEq;
     use std::f64;
 
-    fn parse_transform(s: &str) -> Result<cairo::Matrix, ValueErrorKind> {
-        cairo::Matrix::parse_str(s)
+    fn parse_transform(s: &str) -> Result<cairo::Matrix, CssParseError> {
+        cairo::Matrix::parse_str_to_parse_error(s)
     }
 
     fn assert_matrix_eq(a: &cairo::Matrix, b: &cairo::Matrix) {
@@ -237,26 +245,9 @@ mod tests {
 
     #[test]
     fn invalid_transform_yields_value_error() {
-        match parse_transform("matrix (0 0 0 0 0 0)") {
-            Err(ValueErrorKind::Value(_)) => {}
-            _ => {
-                panic!();
-            }
-        }
-
-        match parse_transform("scale (0), translate (10, 10)") {
-            Err(ValueErrorKind::Value(_)) => {}
-            _ => {
-                panic!();
-            }
-        }
-
-        match parse_transform("scale (0), skewX (90)") {
-            Err(ValueErrorKind::Value(_)) => {}
-            _ => {
-                panic!();
-            }
-        }
+        assert!(parse_transform("matrix (0 0 0 0 0 0)").is_err());
+        assert!(parse_transform("scale (0), translate (10, 10)").is_err());
+        assert!(parse_transform("scale (0), skewX (90)").is_err());
     }
 
     #[test]


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