[librsvg: 42/43] The Great Renaming is done!



commit f7f70fe561704e2f5a00a38b895e05222b39e034
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Dec 20 20:08:54 2019 -0600

    The Great Renaming is done!

 rsvg_internals/src/angle.rs                      |  22 ++--
 rsvg_internals/src/aspect_ratio.rs               |  70 ++++++------
 rsvg_internals/src/clip_path.rs                  |   4 +-
 rsvg_internals/src/color.rs                      |  18 ++-
 rsvg_internals/src/cond.rs                       |   8 +-
 rsvg_internals/src/coord_units.rs                |  20 ++--
 rsvg_internals/src/create_node.rs                |  13 ++-
 rsvg_internals/src/css.rs                        |  11 +-
 rsvg_internals/src/dasharray.rs                  |  68 ++++--------
 rsvg_internals/src/document.rs                   |   1 -
 rsvg_internals/src/drawing_ctx.rs                |  11 +-
 rsvg_internals/src/error.rs                      |  10 +-
 rsvg_internals/src/filter.rs                     |  31 +++---
 rsvg_internals/src/filters/blend.rs              |  10 +-
 rsvg_internals/src/filters/color_matrix.rs       |  30 ++---
 rsvg_internals/src/filters/component_transfer.rs |  25 +++--
 rsvg_internals/src/filters/composite.rs          |  18 +--
 rsvg_internals/src/filters/context.rs            |   6 +-
 rsvg_internals/src/filters/convolve_matrix.rs    |  41 ++++---
 rsvg_internals/src/filters/displacement_map.rs   |  14 +--
 rsvg_internals/src/filters/gaussian_blur.rs      |  10 +-
 rsvg_internals/src/filters/image.rs              |  10 +-
 rsvg_internals/src/filters/input.rs              |  24 ++--
 rsvg_internals/src/filters/light/light_source.rs |  28 ++---
 rsvg_internals/src/filters/light/lighting.rs     |  83 +++++++-------
 rsvg_internals/src/filters/merge.rs              |   4 +-
 rsvg_internals/src/filters/mod.rs                |  16 +--
 rsvg_internals/src/filters/morphology.rs         |  20 ++--
 rsvg_internals/src/filters/offset.rs             |   6 +-
 rsvg_internals/src/filters/turbulence.rs         |  31 +++---
 rsvg_internals/src/font_props.rs                 |  72 ++++++------
 rsvg_internals/src/gradient.rs                   | 122 +++++++++++++--------
 rsvg_internals/src/handle.rs                     |  14 ++-
 rsvg_internals/src/image.rs                      |  12 +-
 rsvg_internals/src/io.rs                         |  18 +--
 rsvg_internals/src/iri.rs                        |  22 ++--
 rsvg_internals/src/length.rs                     |  36 +++---
 rsvg_internals/src/lib.rs                        |   7 +-
 rsvg_internals/src/marker.rs                     |  76 ++++++-------
 rsvg_internals/src/mask.rs                       |  22 ++--
 rsvg_internals/src/node.rs                       |   4 +-
 rsvg_internals/src/number_list.rs                |  45 ++++----
 rsvg_internals/src/paint_server.rs               |  32 +++---
 rsvg_internals/src/parsers.rs                    | 131 +++++++++++-----------
 rsvg_internals/src/pattern.rs                    |  26 ++---
 rsvg_internals/src/properties.rs                 | 131 +++++++++++-----------
 rsvg_internals/src/property_bag.rs               |  37 ++++---
 rsvg_internals/src/property_defs.rs              |  88 +++++++--------
 rsvg_internals/src/property_macros.rs            |  39 ++-----
 rsvg_internals/src/shapes.rs                     | 133 +++++++++++------------
 rsvg_internals/src/structure.rs                  |  41 +++----
 rsvg_internals/src/style.rs                      |   8 +-
 rsvg_internals/src/text.rs                       |  18 +--
 rsvg_internals/src/transform.rs                  |  40 ++++---
 rsvg_internals/src/unit_interval.rs              |  26 ++---
 rsvg_internals/src/viewbox.rs                    |  29 ++---
 rsvg_internals/src/xml.rs                        |  19 +++-
 57 files changed, 955 insertions(+), 956 deletions(-)
---
diff --git a/rsvg_internals/src/angle.rs b/rsvg_internals/src/angle.rs
index 86ecbd13..436bdf79 100644
--- a/rsvg_internals/src/angle.rs
+++ b/rsvg_internals/src/angle.rs
@@ -5,7 +5,7 @@ use std::f64::consts::*;
 use cssparser::{Parser, Token};
 
 use crate::error::*;
-use crate::parsers::{finite_f32, ParseToParseError};
+use crate::parsers::{finite_f32, Parse};
 
 #[derive(Debug, Copy, Clone, PartialEq)]
 pub struct Angle(f64);
@@ -61,8 +61,8 @@ impl Angle {
 //
 // angle ::= number ("deg" | "grad" | "rad")?
 //
-impl ParseToParseError for Angle {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Angle, CssParseError<'i>> {
+impl Parse for Angle {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Angle, CssParseError<'i>> {
         let angle = {
             let loc = parser.current_source_location();
 
@@ -107,18 +107,18 @@ mod tests {
 
     #[test]
     fn parses_angle() {
-        assert_eq!(Angle::parse_str_to_parse_error("0"), Ok(Angle::new(0.0)));
-        assert_eq!(Angle::parse_str_to_parse_error("15"), Ok(Angle::from_degrees(15.0)));
-        assert_eq!(Angle::parse_str_to_parse_error("180.5deg"), Ok(Angle::from_degrees(180.5)));
-        assert_eq!(Angle::parse_str_to_parse_error("1rad"), Ok(Angle::new(1.0)));
+        assert_eq!(Angle::parse_str("0"), Ok(Angle::new(0.0)));
+        assert_eq!(Angle::parse_str("15"), Ok(Angle::from_degrees(15.0)));
+        assert_eq!(Angle::parse_str("180.5deg"), Ok(Angle::from_degrees(180.5)));
+        assert_eq!(Angle::parse_str("1rad"), Ok(Angle::new(1.0)));
         assert_eq!(
-            Angle::parse_str_to_parse_error("-400grad"),
+            Angle::parse_str("-400grad"),
             Ok(Angle::from_degrees(-360.0))
         );
 
-        assert!(Angle::parse_str_to_parse_error("").is_err());
-        assert!(Angle::parse_str_to_parse_error("foo").is_err());
-        assert!(Angle::parse_str_to_parse_error("300foo").is_err());
+        assert!(Angle::parse_str("").is_err());
+        assert!(Angle::parse_str("foo").is_err());
+        assert!(Angle::parse_str("300foo").is_err());
     }
 
     fn test_bisection_angle(
diff --git a/rsvg_internals/src/aspect_ratio.rs b/rsvg_internals/src/aspect_ratio.rs
index 7568a0d5..eb07d6ca 100644
--- a/rsvg_internals/src/aspect_ratio.rs
+++ b/rsvg_internals/src/aspect_ratio.rs
@@ -25,7 +25,7 @@ use std::ops::Deref;
 use cairo;
 
 use crate::error::*;
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 use crate::rect::Rect;
 use crate::viewbox::ViewBox;
 use cssparser::{BasicParseError, Parser};
@@ -221,17 +221,15 @@ fn parse_fit_mode<'i>(parser: &mut Parser<'i, '_>) -> Result<FitMode, BasicParse
     )
 }
 
-impl ParseToParseError for AspectRatio {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<AspectRatio, CssParseError<'i>> {
+impl Parse for AspectRatio {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<AspectRatio, CssParseError<'i>> {
         let defer = parser
             .try_parse(|p| p.expect_ident_matching("defer"))
             .is_ok();
 
         let align_xy = parser.try_parse(|p| parse_align_xy(p))?;
 
-        let fit = parser
-            .try_parse(|p| parse_fit_mode(p))
-            .unwrap_or_default();
+        let fit = parser.try_parse(|p| parse_fit_mode(p)).unwrap_or_default();
 
         parser.expect_exhausted()?;
 
@@ -248,18 +246,18 @@ mod tests {
 
     #[test]
     fn parsing_invalid_strings_yields_error() {
-        assert!(AspectRatio::parse_str_to_parse_error("").is_err());
-        assert!(AspectRatio::parse_str_to_parse_error("defer").is_err());
-        assert!(AspectRatio::parse_str_to_parse_error("defer foo").is_err());
-        assert!(AspectRatio::parse_str_to_parse_error("defer xMidYMid foo").is_err());
-        assert!(AspectRatio::parse_str_to_parse_error("xMidYMid foo").is_err());
-        assert!(AspectRatio::parse_str_to_parse_error("defer xMidYMid meet foo").is_err());
+        assert!(AspectRatio::parse_str("").is_err());
+        assert!(AspectRatio::parse_str("defer").is_err());
+        assert!(AspectRatio::parse_str("defer foo").is_err());
+        assert!(AspectRatio::parse_str("defer xMidYMid foo").is_err());
+        assert!(AspectRatio::parse_str("xMidYMid foo").is_err());
+        assert!(AspectRatio::parse_str("defer xMidYMid meet foo").is_err());
     }
 
     #[test]
     fn parses_valid_strings() {
         assert_eq!(
-            AspectRatio::parse_str_to_parse_error("defer none"),
+            AspectRatio::parse_str("defer none"),
             Ok(AspectRatio {
                 defer: true,
                 align: None,
@@ -267,7 +265,7 @@ mod tests {
         );
 
         assert_eq!(
-            AspectRatio::parse_str_to_parse_error("xMidYMid"),
+            AspectRatio::parse_str("xMidYMid"),
             Ok(AspectRatio {
                 defer: false,
                 align: Some(Align {
@@ -279,7 +277,7 @@ mod tests {
         );
 
         assert_eq!(
-            AspectRatio::parse_str_to_parse_error("defer xMidYMid"),
+            AspectRatio::parse_str("defer xMidYMid"),
             Ok(AspectRatio {
                 defer: true,
                 align: Some(Align {
@@ -291,7 +289,7 @@ mod tests {
         );
 
         assert_eq!(
-            AspectRatio::parse_str_to_parse_error("defer xMinYMax"),
+            AspectRatio::parse_str("defer xMinYMax"),
             Ok(AspectRatio {
                 defer: true,
                 align: Some(Align {
@@ -303,7 +301,7 @@ mod tests {
         );
 
         assert_eq!(
-            AspectRatio::parse_str_to_parse_error("defer xMaxYMid meet"),
+            AspectRatio::parse_str("defer xMaxYMid meet"),
             Ok(AspectRatio {
                 defer: true,
                 align: Some(Align {
@@ -315,7 +313,7 @@ mod tests {
         );
 
         assert_eq!(
-            AspectRatio::parse_str_to_parse_error("defer xMinYMax slice"),
+            AspectRatio::parse_str("defer xMinYMax slice"),
             Ok(AspectRatio {
                 defer: true,
                 align: Some(Align {
@@ -338,75 +336,75 @@ mod tests {
     fn aligns() {
         let viewbox = ViewBox(Rect::from_size(1.0, 10.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMinYMin meet").unwrap();
+        let foo = AspectRatio::parse_str("xMinYMin meet").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::from_size(0.1, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMinYMin slice").unwrap();
+        let foo = AspectRatio::parse_str("xMinYMin slice").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::from_size(10.0, 100.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMinYMid meet").unwrap();
+        let foo = AspectRatio::parse_str("xMinYMid meet").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::from_size(0.1, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMinYMid slice").unwrap();
+        let foo = AspectRatio::parse_str("xMinYMid slice").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(0.0, -49.5, 10.0, 100.0 - 49.5));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMinYMax meet").unwrap();
+        let foo = AspectRatio::parse_str("xMinYMax meet").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::from_size(0.1, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMinYMax slice").unwrap();
+        let foo = AspectRatio::parse_str("xMinYMax slice").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(0.0, -99.0, 10.0, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMidYMin meet").unwrap();
+        let foo = AspectRatio::parse_str("xMidYMin meet").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(4.95, 0.0, 4.95 + 0.1, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMidYMin slice").unwrap();
+        let foo = AspectRatio::parse_str("xMidYMin slice").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::from_size(10.0, 100.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMidYMid meet").unwrap();
+        let foo = AspectRatio::parse_str("xMidYMid meet").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(4.95, 0.0, 4.95 + 0.1, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMidYMid slice").unwrap();
+        let foo = AspectRatio::parse_str("xMidYMid slice").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(0.0, -49.5, 10.0, 100.0 - 49.5));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMidYMax meet").unwrap();
+        let foo = AspectRatio::parse_str("xMidYMax meet").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(4.95, 0.0, 4.95 + 0.1, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMidYMax slice").unwrap();
+        let foo = AspectRatio::parse_str("xMidYMax slice").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(0.0, -99.0, 10.0, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMaxYMin meet").unwrap();
+        let foo = AspectRatio::parse_str("xMaxYMin meet").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(9.9, 0.0, 10.0, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMaxYMin slice").unwrap();
+        let foo = AspectRatio::parse_str("xMaxYMin slice").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::from_size(10.0, 100.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMaxYMid meet").unwrap();
+        let foo = AspectRatio::parse_str("xMaxYMid meet").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(9.9, 0.0, 10.0, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMaxYMid slice").unwrap();
+        let foo = AspectRatio::parse_str("xMaxYMid slice").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(0.0, -49.5, 10.0, 100.0 - 49.5));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMaxYMax meet").unwrap();
+        let foo = AspectRatio::parse_str("xMaxYMax meet").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(9.9, 0.0, 10.0, 1.0));
 
-        let foo = AspectRatio::parse_str_to_parse_error("xMaxYMax slice").unwrap();
+        let foo = AspectRatio::parse_str("xMaxYMax slice").unwrap();
         let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
         assert_rect_equal(&foo, &Rect::new(0.0, -99.0, 10.0, 1.0));
     }
diff --git a/rsvg_internals/src/clip_path.rs b/rsvg_internals/src/clip_path.rs
index 0e332d89..97a512cf 100644
--- a/rsvg_internals/src/clip_path.rs
+++ b/rsvg_internals/src/clip_path.rs
@@ -8,7 +8,7 @@ use crate::coord_units::CoordUnits;
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::RenderingError;
 use crate::node::{CascadedValues, NodeDraw, NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::ParseValueToParseError;
+use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 
 coord_units!(ClipPathUnits, CoordUnits::UserSpaceOnUse);
@@ -73,7 +73,7 @@ impl NodeTrait for ClipPath {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "clipPathUnits") => self.units = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "clipPathUnits") => self.units = attr.parse(value)?,
                 _ => (),
             }
         }
diff --git a/rsvg_internals/src/color.rs b/rsvg_internals/src/color.rs
index 45e914ff..b9c8e9f4 100644
--- a/rsvg_internals/src/color.rs
+++ b/rsvg_internals/src/color.rs
@@ -4,26 +4,22 @@ use cssparser::{self, Parser};
 use libc;
 
 use crate::error::*;
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 use crate::util::utf8_cstr;
 
 pub use cssparser::Color;
 
-impl ParseToParseError for cssparser::Color {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<cssparser::Color, CssParseError<'i>> {
+impl Parse for cssparser::Color {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<cssparser::Color, CssParseError<'i>> {
         Ok(cssparser::Color::parse(parser)?)
     }
 }
 
-impl ParseToParseError for cssparser::RGBA {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<cssparser::RGBA, CssParseError<'i>> {
+impl Parse for cssparser::RGBA {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<cssparser::RGBA, CssParseError<'i>> {
         let loc = parser.current_source_location();
 
-        match cssparser::Color::parse_to_parse_error(parser)? {
+        match cssparser::Color::parse(parser)? {
             cssparser::Color::RGBA(rgba) => Ok(rgba),
             cssparser::Color::CurrentColor => Err(loc.new_custom_error(ValueErrorKind::Value(
                 "currentColor is not allowed here".to_string(),
@@ -106,7 +102,7 @@ pub extern "C" fn rsvg_css_parse_color(string: *const libc::c_char) -> ColorSpec
             argb: 0,
         }
     } else {
-        ColorSpec::from(<Color as ParseToParseError>::parse_str_to_parse_error(s).map(Some))
+        ColorSpec::from(<Color as Parse>::parse_str(s).map(Some))
     }
 }
 
diff --git a/rsvg_internals/src/cond.rs b/rsvg_internals/src/cond.rs
index 231db0fb..25117c69 100644
--- a/rsvg_internals/src/cond.rs
+++ b/rsvg_internals/src/cond.rs
@@ -96,14 +96,14 @@ impl SystemLanguage {
                     if have_match {
                         Ok(SystemLanguage(have_match))
                     } else {
-                        locale_accepts_language_tag(locale, &language_tag)
-                            .map(SystemLanguage)
+                        locale_accepts_language_tag(locale, &language_tag).map(SystemLanguage)
                     }
                 }
 
                 Err(e) => Err(ValueErrorKind::parse_error(&format!(
-                    "invalid language tag: \"{}\"", e)
-                )),
+                    "invalid language tag: \"{}\"",
+                    e
+                ))),
             },
         )
     }
diff --git a/rsvg_internals/src/coord_units.rs b/rsvg_internals/src/coord_units.rs
index 765f5d8f..febd6c77 100644
--- a/rsvg_internals/src/coord_units.rs
+++ b/rsvg_internals/src/coord_units.rs
@@ -3,7 +3,7 @@
 use cssparser::Parser;
 
 use crate::error::*;
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 
 /// Defines the units to be used for things that can consider a
 /// coordinate system in terms of the current transformation, or in
@@ -14,8 +14,8 @@ pub enum CoordUnits {
     ObjectBoundingBox,
 }
 
-impl ParseToParseError for CoordUnits {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for CoordUnits {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "userSpaceOnUse" => CoordUnits::UserSpaceOnUse,
@@ -50,11 +50,11 @@ macro_rules! coord_units {
             }
         }
 
-        impl $crate::parsers::ParseToParseError for $name {
-            fn parse_to_parse_error<'i>(
+        impl $crate::parsers::Parse for $name {
+            fn parse<'i>(
                 parser: &mut ::cssparser::Parser<'i, '_>,
             ) -> Result<Self, $crate::error::CssParseError<'i>> {
-                Ok($name($crate::coord_units::CoordUnits::parse_to_parse_error(parser)?))
+                Ok($name($crate::coord_units::CoordUnits::parse(parser)?))
             }
         }
     };
@@ -68,18 +68,18 @@ mod tests {
 
     #[test]
     fn parsing_invalid_strings_yields_error() {
-        assert!(MyUnits::parse_str_to_parse_error("").is_err());
-        assert!(MyUnits::parse_str_to_parse_error("foo").is_err());
+        assert!(MyUnits::parse_str("").is_err());
+        assert!(MyUnits::parse_str("foo").is_err());
     }
 
     #[test]
     fn parses_paint_server_units() {
         assert_eq!(
-            MyUnits::parse_str_to_parse_error("userSpaceOnUse"),
+            MyUnits::parse_str("userSpaceOnUse"),
             Ok(MyUnits(CoordUnits::UserSpaceOnUse))
         );
         assert_eq!(
-            MyUnits::parse_str_to_parse_error("objectBoundingBox"),
+            MyUnits::parse_str("objectBoundingBox"),
             Ok(MyUnits(CoordUnits::ObjectBoundingBox))
         );
     }
diff --git a/rsvg_internals/src/create_node.rs b/rsvg_internals/src/create_node.rs
index b8aaf1d9..9e194bb5 100644
--- a/rsvg_internals/src/create_node.rs
+++ b/rsvg_internals/src/create_node.rs
@@ -22,8 +22,11 @@ use crate::filters::{
     gaussian_blur::FeGaussianBlur,
     image::FeImage,
     light::{
-        light_source::FeDistantLight, light_source::FePointLight, light_source::FeSpotLight,
-        lighting::FeDiffuseLighting, lighting::FeSpecularLighting,
+        light_source::FeDistantLight,
+        light_source::FePointLight,
+        light_source::FeSpotLight,
+        lighting::FeDiffuseLighting,
+        lighting::FeSpecularLighting,
     },
     merge::{FeMerge, FeMergeNode},
     morphology::FeMorphology,
@@ -265,7 +268,7 @@ pub fn create_node(name: &QualName, pbag: &PropertyBag) -> RsvgNode {
         class = None;
     };
 
-//    sizes::print_sizes();
+    //    sizes::print_sizes();
 
     create_fn(name, id, class)
 }
@@ -279,12 +282,12 @@ mod sizes {
     macro_rules! print_size {
         ($ty:ty) => {
             println!("sizeof {}: {}", stringify!($ty), mem::size_of::<$ty>());
-        }
+        };
     }
 
     pub fn print_sizes() {
-        use std::mem;
         use crate::properties::{ComputedValues, ParsedProperty, SpecifiedValues};
+        use std::mem;
 
         print_size!(NodeData);
         print_size!(SpecifiedValues);
diff --git a/rsvg_internals/src/css.rs b/rsvg_internals/src/css.rs
index 607f4dda..cdf9e205 100644
--- a/rsvg_internals/src/css.rs
+++ b/rsvg_internals/src/css.rs
@@ -13,7 +13,6 @@
 //! }
 //!
 //! #baz { stroke-width: 42; }
-//!
 //! ```
 //! The example contains three **rules**, the first one is an **at-rule*,
 //! the other two are **qualified rules**.
@@ -122,8 +121,8 @@ impl<'i> DeclarationParser<'i> for DeclParser {
         input: &mut Parser<'i, 't>,
     ) -> Result<Declaration, CssParseError<'i>> {
         let prop_name = QualName::new(None, ns!(svg), LocalName::from(name.as_ref()));
-        let property =
-            parse_property(&prop_name, input, true).map_err(|_| 
input.new_custom_error(ValueErrorKind::parse_error("parse error")))?;
+        let property = parse_property(&prop_name, input, true)
+            .map_err(|_| input.new_custom_error(ValueErrorKind::parse_error("parse error")))?;
 
         let important = input.try_parse(parse_important).is_ok();
 
@@ -265,8 +264,10 @@ impl<'i> AtRuleParser<'i> for RuleParser {
         &mut self,
         name: CowRcStr<'i>,
         input: &mut Parser<'i, 't>,
-    ) -> Result<AtRuleType<Self::PreludeNoBlock, Self::PreludeBlock>, cssparser::ParseError<'i, Self::Error>>
-    {
+    ) -> Result<
+        AtRuleType<Self::PreludeNoBlock, Self::PreludeBlock>,
+        cssparser::ParseError<'i, Self::Error>,
+    > {
         match_ignore_ascii_case! { &name,
             "import" => {
                 // FIXME: at the moment we ignore media queries
diff --git a/rsvg_internals/src/dasharray.rs b/rsvg_internals/src/dasharray.rs
index 4f83fc4a..1b31c269 100644
--- a/rsvg_internals/src/dasharray.rs
+++ b/rsvg_internals/src/dasharray.rs
@@ -4,7 +4,7 @@ use cssparser::Parser;
 
 use crate::error::*;
 use crate::length::*;
-use crate::parsers::{optional_comma, ParseToParseError};
+use crate::parsers::{optional_comma, Parse};
 
 #[derive(Debug, PartialEq, Clone)]
 pub enum Dasharray {
@@ -18,10 +18,8 @@ impl Default for Dasharray {
     }
 }
 
-impl ParseToParseError for Dasharray {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<Dasharray, CssParseError<'i>> {
+impl Parse for Dasharray {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Dasharray, CssParseError<'i>> {
         if parser
             .try_parse(|p| p.expect_ident_matching("none"))
             .is_ok()
@@ -34,7 +32,7 @@ impl ParseToParseError for Dasharray {
         loop {
             let loc = parser.current_source_location();
 
-            let d = Length::<Both>::parse_to_parse_error(parser)?
+            let d = Length::<Both>::parse(parser)?
                 .check_nonnegative()
                 .map_err(|e| loc.new_custom_error(e))?;
             dasharray.push(d);
@@ -57,7 +55,7 @@ mod tests {
     #[test]
     fn parses_dash_array() {
         // helper to cut down boilderplate
-        let length_parse = |s| Length::<Both>::parse_str_to_parse_error(s).unwrap();
+        let length_parse = |s| Length::<Both>::parse_str(s).unwrap();
 
         let expected = Dasharray::Array(vec![
             length_parse("1"),
@@ -91,53 +89,29 @@ mod tests {
         let sample_6 = Dasharray::Array(vec![length_parse("5"), length_parse("3.14")]);
         let sample_7 = Dasharray::Array(vec![length_parse("2")]);
 
-        assert_eq!(
-            Dasharray::parse_str_to_parse_error("none").unwrap(),
-            Dasharray::None
-        );
-        assert_eq!(
-            Dasharray::parse_str_to_parse_error("1 2in,3 4%").unwrap(),
-            expected
-        );
-        assert_eq!(
-            Dasharray::parse_str_to_parse_error("10,6").unwrap(),
-            sample_1
-        );
-        assert_eq!(
-            Dasharray::parse_str_to_parse_error("5,5,20").unwrap(),
-            sample_2
-        );
-        assert_eq!(
-            Dasharray::parse_str_to_parse_error("10px 20px 20px").unwrap(),
-            sample_3
-        );
-        assert_eq!(
-            Dasharray::parse_str_to_parse_error("25  5 , 5 5").unwrap(),
-            sample_4
-        );
-        assert_eq!(
-            Dasharray::parse_str_to_parse_error("3.1415926,8").unwrap(),
-            sample_5
-        );
-        assert_eq!(
-            Dasharray::parse_str_to_parse_error("5, 3.14").unwrap(),
-            sample_6
-        );
-        assert_eq!(Dasharray::parse_str_to_parse_error("2").unwrap(), sample_7);
+        assert_eq!(Dasharray::parse_str("none").unwrap(), Dasharray::None);
+        assert_eq!(Dasharray::parse_str("1 2in,3 4%").unwrap(), expected);
+        assert_eq!(Dasharray::parse_str("10,6").unwrap(), sample_1);
+        assert_eq!(Dasharray::parse_str("5,5,20").unwrap(), sample_2);
+        assert_eq!(Dasharray::parse_str("10px 20px 20px").unwrap(), sample_3);
+        assert_eq!(Dasharray::parse_str("25  5 , 5 5").unwrap(), sample_4);
+        assert_eq!(Dasharray::parse_str("3.1415926,8").unwrap(), sample_5);
+        assert_eq!(Dasharray::parse_str("5, 3.14").unwrap(), sample_6);
+        assert_eq!(Dasharray::parse_str("2").unwrap(), sample_7);
 
         // Negative numbers
-        assert!(Dasharray::parse_str_to_parse_error("20,40,-20").is_err());
+        assert!(Dasharray::parse_str("20,40,-20").is_err());
 
         // Empty dash_array
-        assert!(Dasharray::parse_str_to_parse_error("").is_err());
-        assert!(Dasharray::parse_str_to_parse_error("\t  \n     ").is_err());
-        assert!(Dasharray::parse_str_to_parse_error(",,,").is_err());
-        assert!(Dasharray::parse_str_to_parse_error("10,  \t, 20 \n").is_err());
+        assert!(Dasharray::parse_str("").is_err());
+        assert!(Dasharray::parse_str("\t  \n     ").is_err());
+        assert!(Dasharray::parse_str(",,,").is_err());
+        assert!(Dasharray::parse_str("10,  \t, 20 \n").is_err());
 
         // No trailing commas allowed, parse error
-        assert!(Dasharray::parse_str_to_parse_error("10,").is_err());
+        assert!(Dasharray::parse_str("10,").is_err());
 
         // A comma should be followed by a number
-        assert!(Dasharray::parse_str_to_parse_error("20,,10").is_err());
+        assert!(Dasharray::parse_str("20,,10").is_err());
     }
 }
diff --git a/rsvg_internals/src/document.rs b/rsvg_internals/src/document.rs
index cd893e7b..97bf7d09 100644
--- a/rsvg_internals/src/document.rs
+++ b/rsvg_internals/src/document.rs
@@ -32,7 +32,6 @@ pub struct Document {
     // The following two require interior mutability because we load the extern
     // resources all over the place.  Eventually we'll be able to do this
     // once, at loading time, and keep this immutable.
-
     /// SVG documents referenced from this document.
     externs: RefCell<Resources>,
 
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 50737b06..4e8eac81 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -23,7 +23,12 @@ use crate::paint_server::{PaintServer, PaintSource};
 use crate::pattern::Pattern;
 use crate::properties::ComputedValues;
 use crate::property_defs::{
-    ClipRule, FillRule, ShapeRendering, StrokeDasharray, StrokeLinecap, StrokeLinejoin,
+    ClipRule,
+    FillRule,
+    ShapeRendering,
+    StrokeDasharray,
+    StrokeLinecap,
+    StrokeLinejoin,
 };
 use crate::rect::Rect;
 use crate::surface_utils::shared_surface::SharedImageSurface;
@@ -1070,8 +1075,8 @@ impl AcquiredNodes {
             // Maybe we should have the following stages:
             //   - load main SVG XML
             //
-            //   - load secondary SVG XML and other files like images;
-            //     all document::Resources and document::Images loaded
+            //   - load secondary SVG XML and other files like images; all document::Resources and
+            //     document::Images loaded
             //
             //   - Now that all files are loaded, resolve URL references
             AcquireError::LinkNotFound(fragment.clone())
diff --git a/rsvg_internals/src/error.rs b/rsvg_internals/src/error.rs
index c831c153..1f01ed5d 100644
--- a/rsvg_internals/src/error.rs
+++ b/rsvg_internals/src/error.rs
@@ -34,7 +34,7 @@ impl<'i> From<CssParseError<'i>> for ParseError<'i> {
 }
 
 impl<'i> From<ValueErrorKind> for ParseError<'i> {
-    fn from (v: ValueErrorKind) -> ParseError<'i> {
+    fn from(v: ValueErrorKind) -> ParseError<'i> {
         ParseError::V(v)
     }
 }
@@ -219,16 +219,16 @@ impl<'i, O> AttributeResultExt<O> for Result<O, CssParseError<'i>> {
                         attr,
                         err: ValueErrorKind::Parse(s),
                     }
-                },
+                }
 
                 ParseErrorKind::Basic(BasicParseErrorKind::EndOfInput) => NodeError {
                     attr,
                     err: ValueErrorKind::parse_error("unexpected end of input"),
                 },
 
-                ParseErrorKind::Basic(_) => unreachable!(
-                    "attribute parsers should not return errors for CSS rules"
-                ),
+                ParseErrorKind::Basic(_) => {
+                    unreachable!("attribute parsers should not return errors for CSS rules")
+                }
 
                 ParseErrorKind::Custom(err) => NodeError { attr, err },
             }
diff --git a/rsvg_internals/src/filter.rs b/rsvg_internals/src/filter.rs
index c99669c5..16e813e7 100644
--- a/rsvg_internals/src/filter.rs
+++ b/rsvg_internals/src/filter.rs
@@ -9,7 +9,7 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::error::ValueErrorKind;
 use crate::length::*;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
 use crate::rect::Rect;
@@ -28,10 +28,10 @@ impl Default for Filter {
     /// Constructs a new `Filter` with default properties.
     fn default() -> Self {
         Self {
-            x: Length::<Horizontal>::parse_str_to_parse_error("-10%").unwrap(),
-            y: Length::<Vertical>::parse_str_to_parse_error("-10%").unwrap(),
-            width: Length::<Horizontal>::parse_str_to_parse_error("120%").unwrap(),
-            height: Length::<Vertical>::parse_str_to_parse_error("120%").unwrap(),
+            x: Length::<Horizontal>::parse_str("-10%").unwrap(),
+            y: Length::<Vertical>::parse_str("-10%").unwrap(),
+            width: Length::<Horizontal>::parse_str("120%").unwrap(),
+            height: Length::<Vertical>::parse_str("120%").unwrap(),
             filterunits: CoordUnits::ObjectBoundingBox,
             primitiveunits: CoordUnits::UserSpaceOnUse,
         }
@@ -115,7 +115,7 @@ impl NodeTrait for Filter {
         // Parse filterUnits first as it affects x, y, width, height checks.
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "filterUnits") => self.filterunits = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "filterUnits") => self.filterunits = attr.parse(value)?,
                 _ => (),
             }
         }
@@ -161,25 +161,20 @@ impl NodeTrait for Filter {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "x") => {
-                    self.x =
-                        attr.parse_to_parse_error_and_validate(value, check_units_horizontal)?
+                    self.x = attr.parse_and_validate(value, check_units_horizontal)?
                 }
                 expanded_name!(svg "y") => {
-                    self.y = attr.parse_to_parse_error_and_validate(value, check_units_vertical)?
+                    self.y = attr.parse_and_validate(value, check_units_vertical)?
                 }
                 expanded_name!(svg "width") => {
-                    self.width = attr.parse_to_parse_error_and_validate(
-                        value,
-                        check_units_horizontal_and_ensure_nonnegative,
-                    )?
+                    self.width = attr
+                        .parse_and_validate(value, check_units_horizontal_and_ensure_nonnegative)?
                 }
                 expanded_name!(svg "height") => {
-                    self.height = attr.parse_to_parse_error_and_validate(
-                        value,
-                        check_units_vertical_and_ensure_nonnegative,
-                    )?
+                    self.height =
+                        attr.parse_and_validate(value, check_units_vertical_and_ensure_nonnegative)?
                 }
-                expanded_name!(svg "primitiveUnits") => self.primitiveunits = 
attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "primitiveUnits") => self.primitiveunits = attr.parse(value)?,
                 _ => (),
             }
         }
diff --git a/rsvg_internals/src/filters/blend.rs b/rsvg_internals/src/filters/blend.rs
index 2c4f7f25..d084e166 100755
--- a/rsvg_internals/src/filters/blend.rs
+++ b/rsvg_internals/src/filters/blend.rs
@@ -5,7 +5,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::shared_surface::SharedImageSurface;
 
@@ -62,9 +62,9 @@ impl NodeTrait for FeBlend {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "in2") => {
-                    self.in2 = Some(attr.parse_to_parse_error(value)?);
+                    self.in2 = Some(attr.parse(value)?);
                 }
-                expanded_name!(svg "mode") => self.mode = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "mode") => self.mode = attr.parse(value)?,
                 _ => (),
             }
         }
@@ -133,8 +133,8 @@ impl FilterEffect for FeBlend {
     }
 }
 
-impl ParseToParseError for Mode {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for Mode {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "normal" => Mode::Normal,
diff --git a/rsvg_internals/src/filters/color_matrix.rs b/rsvg_internals/src/filters/color_matrix.rs
index d46ef424..8530f9f5 100644
--- a/rsvg_internals/src/filters/color_matrix.rs
+++ b/rsvg_internals/src/filters/color_matrix.rs
@@ -7,10 +7,13 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
 use crate::number_list::{NumberList, NumberListLength};
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::{
-    iterators::Pixels, shared_surface::SharedImageSurface, ImageSurfaceDataExt, Pixel,
+    iterators::Pixels,
+    shared_surface::SharedImageSurface,
+    ImageSurfaceDataExt,
+    Pixel,
 };
 use crate::util::clamp;
 
@@ -61,7 +64,7 @@ impl NodeTrait for FeColorMatrix {
             .iter()
             .filter(|(attr, _)| attr.expanded() == expanded_name!(svg "type"))
         {
-            operation_type = attr.parse_to_parse_error(value)?;
+            operation_type = attr.parse(value)?;
         }
 
         // Now read the matrix correspondingly.
@@ -85,25 +88,22 @@ impl NodeTrait for FeColorMatrix {
                 let new_matrix = match operation_type {
                     OperationType::LuminanceToAlpha => unreachable!(),
                     OperationType::Matrix => {
-                        let NumberList(v) = NumberList::parse_str_to_parse_error(
-                            value,
-                            NumberListLength::Exact(20),
-                        )
-                        .attribute(attr)?;
+                        let NumberList(v) =
+                            NumberList::parse_str(value, NumberListLength::Exact(20))
+                                .attribute(attr)?;
                         let matrix = Matrix4x5::from_row_slice(&v);
                         let mut matrix = matrix.fixed_resize(0.0);
                         matrix[(4, 4)] = 1.0;
                         matrix
                     }
                     OperationType::Saturate => {
-                        let s: f64 = attr.parse_to_parse_error_and_validate(
-                            value,
-                            |s| if s < 0.0 || s > 1.0 {
+                        let s: f64 = attr.parse_and_validate(value, |s| {
+                            if s < 0.0 || s > 1.0 {
                                 Err(ValueErrorKind::value_error("expected value from 0 to 1"))
                             } else {
                                 Ok(s)
                             }
-                        )?;
+                        })?;
 
                         #[cfg_attr(rustfmt, rustfmt_skip)]
                         Matrix5::new(
@@ -115,7 +115,7 @@ impl NodeTrait for FeColorMatrix {
                         )
                     }
                     OperationType::HueRotate => {
-                        let degrees: f64 = attr.parse_to_parse_error(value)?;
+                        let degrees: f64 = attr.parse(value)?;
                         let (sin, cos) = degrees.to_radians().sin_cos();
 
                         #[cfg_attr(rustfmt, rustfmt_skip)]
@@ -227,8 +227,8 @@ impl FilterEffect for FeColorMatrix {
     }
 }
 
-impl ParseToParseError for OperationType {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for OperationType {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "matrix" => OperationType::Matrix,
diff --git a/rsvg_internals/src/filters/component_transfer.rs 
b/rsvg_internals/src/filters/component_transfer.rs
index 7c73461a..94ff169f 100644
--- a/rsvg_internals/src/filters/component_transfer.rs
+++ b/rsvg_internals/src/filters/component_transfer.rs
@@ -8,10 +8,13 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{NodeResult, NodeTrait, NodeType, RsvgNode};
 use crate::number_list::{NumberList, NumberListLength};
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::{
-    iterators::Pixels, shared_surface::SharedImageSurface, ImageSurfaceDataExt, Pixel,
+    iterators::Pixels,
+    shared_surface::SharedImageSurface,
+    ImageSurfaceDataExt,
+    Pixel,
 };
 use crate::util::clamp;
 
@@ -60,8 +63,8 @@ enum FunctionType {
     Gamma,
 }
 
-impl ParseToParseError for FunctionType {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for FunctionType {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "identity" => FunctionType::Identity,
@@ -208,19 +211,19 @@ macro_rules! func_x {
                 for (attr, value) in pbag.iter() {
                     match attr.expanded() {
                         expanded_name!(svg "type") => {
-                            self.function_type = attr.parse_to_parse_error(value)?
+                            self.function_type = attr.parse(value)?
                         }
                         expanded_name!(svg "tableValues") => {
                             let NumberList(v) =
-                                NumberList::parse_str_to_parse_error(value, NumberListLength::Unbounded)
+                                NumberList::parse_str(value, NumberListLength::Unbounded)
                                 .attribute(attr)?;
                             self.table_values = v;
                         }
-                        expanded_name!(svg "slope") => self.slope = attr.parse_to_parse_error(value)?,
-                        expanded_name!(svg "intercept") => self.intercept = 
attr.parse_to_parse_error(value)?,
-                        expanded_name!(svg "amplitude") => self.amplitude = 
attr.parse_to_parse_error(value)?,
-                        expanded_name!(svg "exponent") => self.exponent = attr.parse_to_parse_error(value)?,
-                        expanded_name!(svg "offset") => self.offset = attr.parse_to_parse_error(value)?,
+                        expanded_name!(svg "slope") => self.slope = attr.parse(value)?,
+                        expanded_name!(svg "intercept") => self.intercept = attr.parse(value)?,
+                        expanded_name!(svg "amplitude") => self.amplitude = attr.parse(value)?,
+                        expanded_name!(svg "exponent") => self.exponent = attr.parse(value)?,
+                        expanded_name!(svg "offset") => self.offset = attr.parse(value)?,
 
                         _ => (),
                     }
diff --git a/rsvg_internals/src/filters/composite.rs b/rsvg_internals/src/filters/composite.rs
index 13d649ac..da3bc3f1 100644
--- a/rsvg_internals/src/filters/composite.rs
+++ b/rsvg_internals/src/filters/composite.rs
@@ -5,7 +5,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::rect::IRect;
 use crate::surface_utils::{
@@ -66,12 +66,12 @@ impl NodeTrait for FeComposite {
 
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "in2") => self.in2 = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "operator") => self.operator = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "k1") => self.k1 = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "k2") => self.k2 = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "k3") => self.k3 = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "k4") => self.k4 = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "in2") => self.in2 = Some(attr.parse(value)?),
+                expanded_name!(svg "operator") => self.operator = attr.parse(value)?,
+                expanded_name!(svg "k1") => self.k1 = attr.parse(value)?,
+                expanded_name!(svg "k2") => self.k2 = attr.parse(value)?,
+                expanded_name!(svg "k3") => self.k3 = attr.parse(value)?,
+                expanded_name!(svg "k4") => self.k4 = attr.parse(value)?,
                 _ => (),
             }
         }
@@ -211,8 +211,8 @@ impl FilterEffect for FeComposite {
     }
 }
 
-impl ParseToParseError for Operator {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for Operator {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "over" => Operator::Over,
diff --git a/rsvg_internals/src/filters/context.rs b/rsvg_internals/src/filters/context.rs
index af1459bc..f9d570ec 100644
--- a/rsvg_internals/src/filters/context.rs
+++ b/rsvg_internals/src/filters/context.rs
@@ -227,7 +227,11 @@ impl FilterContext {
         );
 
         // Return the only existing reference as immutable.
-        bg.as_ref().unwrap().as_ref().map(|surf| surf.clone()).map_err(|&s| s)
+        bg.as_ref()
+            .unwrap()
+            .as_ref()
+            .map(|surf| surf.clone())
+            .map_err(|&s| s)
     }
 
     /// Returns the surface containing the background image snapshot alpha.
diff --git a/rsvg_internals/src/filters/convolve_matrix.rs b/rsvg_internals/src/filters/convolve_matrix.rs
index cd3af8a6..f49d00b6 100644
--- a/rsvg_internals/src/filters/convolve_matrix.rs
+++ b/rsvg_internals/src/filters/convolve_matrix.rs
@@ -7,13 +7,15 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
 use crate::number_list::{NumberList, NumberListLength};
-use crate::parsers::{NumberOptionalNumber, ParseToParseError, ParseValueToParseError};
+use crate::parsers::{NumberOptionalNumber, Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::rect::IRect;
 use crate::surface_utils::{
     iterators::{PixelRectangle, Pixels},
     shared_surface::SharedImageSurface,
-    EdgeMode, ImageSurfaceDataExt, Pixel,
+    EdgeMode,
+    ImageSurfaceDataExt,
+    Pixel,
 };
 use crate::util::clamp;
 
@@ -62,20 +64,18 @@ impl NodeTrait for FeConvolveMatrix {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "order") => {
-                    let NumberOptionalNumber(x, y) = attr.parse_to_parse_error_and_validate(
-                        value,
-                        |v: NumberOptionalNumber<i32>| {
+                    let NumberOptionalNumber(x, y) =
+                        attr.parse_and_validate(value, |v: NumberOptionalNumber<i32>| {
                             if v.0 > 0 && v.1 > 0 {
                                 Ok(v)
                             } else {
                                 Err(ValueErrorKind::value_error("values must be greater than 0"))?
                             }
-                        },
-                    )?;
+                        })?;
                     self.order = (x as u32, y as u32);
                 }
                 expanded_name!(svg "divisor") => {
-                    self.divisor = Some(attr.parse_to_parse_error_and_validate(value, |x| {
+                    self.divisor = Some(attr.parse_and_validate(value, |x| {
                         if x != 0.0 {
                             Ok(x)
                         } else {
@@ -83,11 +83,11 @@ impl NodeTrait for FeConvolveMatrix {
                         }
                     })?)
                 }
-                expanded_name!(svg "bias") => self.bias = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "edgeMode") => self.edge_mode = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "bias") => self.bias = attr.parse(value)?,
+                expanded_name!(svg "edgeMode") => self.edge_mode = attr.parse(value)?,
                 expanded_name!(svg "kernelUnitLength") => {
                     let NumberOptionalNumber(x, y) =
-                        attr.parse_to_parse_error_and_validate(value, |v: NumberOptionalNumber<f64>| {
+                        attr.parse_and_validate(value, |v: NumberOptionalNumber<f64>| {
                             if v.0 > 0.0 && v.1 > 0.0 {
                                 Ok(v)
                             } else {
@@ -99,7 +99,7 @@ impl NodeTrait for FeConvolveMatrix {
 
                     self.kernel_unit_length = Some((x, y))
                 }
-                expanded_name!(svg "preserveAlpha") => self.preserve_alpha = 
attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "preserveAlpha") => self.preserve_alpha = attr.parse(value)?,
 
                 _ => (),
             }
@@ -110,7 +110,7 @@ impl NodeTrait for FeConvolveMatrix {
             match attr.expanded() {
                 expanded_name!(svg "targetX") => {
                     self.target_x = {
-                        let v = attr.parse_to_parse_error_and_validate(value, |v: i32| {
+                        let v = attr.parse_and_validate(value, |v: i32| {
                             if v >= 0 && v < self.order.0 as i32 {
                                 Ok(v)
                             } else {
@@ -124,7 +124,7 @@ impl NodeTrait for FeConvolveMatrix {
                 }
                 expanded_name!(svg "targetY") => {
                     self.target_y = {
-                        let v = attr.parse_to_parse_error_and_validate(value, |v: i32| {
+                        let v = attr.parse_and_validate(value, |v: i32| {
                             if v >= 0 && v < self.order.1 as i32 {
                                 Ok(v)
                             } else {
@@ -158,9 +158,8 @@ impl NodeTrait for FeConvolveMatrix {
 
                 // #352: Parse as an unbounded list rather than exact length to prevent aborts due
                 //       to huge allocation attempts by underlying Vec::with_capacity().
-                let NumberList(v) =
-                    NumberList::parse_str_to_parse_error(value, NumberListLength::Unbounded)
-                        .attribute(attr.clone())?;
+                let NumberList(v) = NumberList::parse_str(value, NumberListLength::Unbounded)
+                    .attribute(attr.clone())?;
 
                 if v.len() != number_of_elements {
                     return Err(ValueErrorKind::value_error(&format!(
@@ -337,8 +336,8 @@ impl FilterEffect for FeConvolveMatrix {
     }
 }
 
-impl ParseToParseError for EdgeMode {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for EdgeMode {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "duplicate" => EdgeMode::Duplicate,
@@ -349,8 +348,8 @@ impl ParseToParseError for EdgeMode {
 }
 
 // Used for the preserveAlpha attribute
-impl ParseToParseError for bool {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for bool {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "false" => false,
diff --git a/rsvg_internals/src/filters/displacement_map.rs b/rsvg_internals/src/filters/displacement_map.rs
index a2ee071a..0cf9725b 100644
--- a/rsvg_internals/src/filters/displacement_map.rs
+++ b/rsvg_internals/src/filters/displacement_map.rs
@@ -5,7 +5,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::{iterators::Pixels, shared_surface::SharedImageSurface};
 
@@ -52,15 +52,15 @@ impl NodeTrait for FeDisplacementMap {
 
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "in2") => self.in2 = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "scale") => self.scale = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "in2") => self.in2 = Some(attr.parse(value)?),
+                expanded_name!(svg "scale") => self.scale = attr.parse(value)?,
 
                 expanded_name!(svg "xChannelSelector") => {
-                    self.x_channel_selector = attr.parse_to_parse_error(value)?
+                    self.x_channel_selector = attr.parse(value)?
                 }
 
                 expanded_name!(svg "yChannelSelector") => {
-                    self.y_channel_selector = attr.parse_to_parse_error(value)?
+                    self.y_channel_selector = attr.parse(value)?
                 }
                 _ => (),
             }
@@ -146,8 +146,8 @@ impl FilterEffect for FeDisplacementMap {
     }
 }
 
-impl ParseToParseError for ColorChannel {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for ColorChannel {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "R" => ColorChannel::R,
diff --git a/rsvg_internals/src/filters/gaussian_blur.rs b/rsvg_internals/src/filters/gaussian_blur.rs
index bd6f1464..751e7cad 100644
--- a/rsvg_internals/src/filters/gaussian_blur.rs
+++ b/rsvg_internals/src/filters/gaussian_blur.rs
@@ -7,7 +7,7 @@ use nalgebra::{DMatrix, Dynamic, VecStorage};
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::{NumberOptionalNumber, ParseValueToParseError};
+use crate::parsers::{NumberOptionalNumber, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::rect::IRect;
 use crate::surface_utils::{
@@ -49,16 +49,14 @@ impl NodeTrait for FeGaussianBlur {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "stdDeviation") => {
-                    let NumberOptionalNumber(x, y) = attr.parse_to_parse_error_and_validate(
-                        value,
-                        |v: NumberOptionalNumber<f64>| {
+                    let NumberOptionalNumber(x, y) =
+                        attr.parse_and_validate(value, |v: NumberOptionalNumber<f64>| {
                             if v.0 >= 0.0 && v.1 >= 0.0 {
                                 Ok(v)
                             } else {
                                 Err(ValueErrorKind::value_error("values can't be negative"))
                             }
-                        },
-                    )?;
+                        })?;
 
                     self.std_deviation = (x, y);
                 }
diff --git a/rsvg_internals/src/filters/image.rs b/rsvg_internals/src/filters/image.rs
index af5ff42d..4f871bca 100644
--- a/rsvg_internals/src/filters/image.rs
+++ b/rsvg_internals/src/filters/image.rs
@@ -6,7 +6,7 @@ use crate::aspect_ratio::AspectRatio;
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{CascadedValues, NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::ParseValueToParseError;
+use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 use crate::rect::Rect;
 use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
@@ -162,13 +162,13 @@ impl NodeTrait for FeImage {
 
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "preserveAspectRatio") => self.aspect = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "preserveAspectRatio") => self.aspect = attr.parse(value)?,
 
                 // "path" is used by some older Adobe Illustrator versions
                 expanded_name!(xlink "href") | expanded_name!(svg "path") => {
-                    let href = Href::parse(value).map_err(|_| {
-                        ValueErrorKind::parse_error("could not parse href")
-                    }).attribute(attr)?;
+                    let href = Href::parse(value)
+                        .map_err(|_| ValueErrorKind::parse_error("could not parse href"))
+                        .attribute(attr)?;
 
                     self.href = Some(href);
                 }
diff --git a/rsvg_internals/src/filters/input.rs b/rsvg_internals/src/filters/input.rs
index 8d1302ef..2547edad 100644
--- a/rsvg_internals/src/filters/input.rs
+++ b/rsvg_internals/src/filters/input.rs
@@ -1,7 +1,7 @@
 use cssparser::{BasicParseError, Parser, Token};
 
 use crate::error::*;
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 
 /// An enumeration of possible inputs for a filter primitive.
 #[derive(Debug, Clone, Eq, PartialEq, Hash)]
@@ -19,8 +19,8 @@ pub enum Input {
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct CustomIdent(String);
 
-impl ParseToParseError for Input {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for Input {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         parser
             .try_parse(|p| {
                 Ok(parse_identifiers!(
@@ -34,14 +34,14 @@ impl ParseToParseError for Input {
                 )?)
             })
             .or_else(|_: BasicParseError| {
-                let ident = CustomIdent::parse_to_parse_error(parser)?;
+                let ident = CustomIdent::parse(parser)?;
                 Ok(Input::FilterOutput(ident))
             })
     }
 }
 
-impl ParseToParseError for CustomIdent {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for CustomIdent {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         let loc = parser.current_source_location();
         let token = parser.next()?;
 
@@ -70,17 +70,17 @@ mod tests {
     #[test]
     fn parses_custom_ident() {
         assert_eq!(
-            CustomIdent::parse_str_to_parse_error("hello"),
+            CustomIdent::parse_str("hello"),
             Ok(CustomIdent("hello".to_string()))
         );
     }
 
     #[test]
     fn invalid_custom_ident_yields_error() {
-        assert!(CustomIdent::parse_str_to_parse_error("initial").is_err());
-        assert!(CustomIdent::parse_str_to_parse_error("inherit").is_err());
-        assert!(CustomIdent::parse_str_to_parse_error("unset").is_err());
-        assert!(CustomIdent::parse_str_to_parse_error("default").is_err());
-        assert!(CustomIdent::parse_str_to_parse_error("").is_err());
+        assert!(CustomIdent::parse_str("initial").is_err());
+        assert!(CustomIdent::parse_str("inherit").is_err());
+        assert!(CustomIdent::parse_str("unset").is_err());
+        assert!(CustomIdent::parse_str("default").is_err());
+        assert!(CustomIdent::parse_str("").is_err());
     }
 }
diff --git a/rsvg_internals/src/filters/light/light_source.rs 
b/rsvg_internals/src/filters/light/light_source.rs
index 1f217b86..21991fcd 100644
--- a/rsvg_internals/src/filters/light/light_source.rs
+++ b/rsvg_internals/src/filters/light/light_source.rs
@@ -4,7 +4,7 @@ use nalgebra::Vector3;
 
 use crate::filters::context::FilterContext;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::ParseValueToParseError;
+use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 use crate::util::clamp;
 
@@ -106,8 +106,8 @@ impl NodeTrait for FeDistantLight {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "azimuth") => self.azimuth = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "elevation") => self.elevation = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "azimuth") => self.azimuth = attr.parse(value)?,
+                expanded_name!(svg "elevation") => self.elevation = attr.parse(value)?,
                 _ => (),
             }
         }
@@ -138,9 +138,9 @@ impl NodeTrait for FePointLight {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "x") => self.x = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "y") => self.y = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "z") => self.z = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "x") => self.x = attr.parse(value)?,
+                expanded_name!(svg "y") => self.y = attr.parse(value)?,
+                expanded_name!(svg "z") => self.z = attr.parse(value)?,
                 _ => (),
             }
         }
@@ -187,19 +187,19 @@ impl NodeTrait for FeSpotLight {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "x") => self.x = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "y") => self.y = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "z") => self.z = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "pointsAtX") => self.points_at_x = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "pointsAtY") => self.points_at_y = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "pointsAtZ") => self.points_at_z = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "x") => self.x = attr.parse(value)?,
+                expanded_name!(svg "y") => self.y = attr.parse(value)?,
+                expanded_name!(svg "z") => self.z = attr.parse(value)?,
+                expanded_name!(svg "pointsAtX") => self.points_at_x = attr.parse(value)?,
+                expanded_name!(svg "pointsAtY") => self.points_at_y = attr.parse(value)?,
+                expanded_name!(svg "pointsAtZ") => self.points_at_z = attr.parse(value)?,
 
                 expanded_name!(svg "specularExponent") => {
-                    self.specular_exponent = attr.parse_to_parse_error(value)?
+                    self.specular_exponent = attr.parse(value)?
                 }
 
                 expanded_name!(svg "limitingConeAngle") => {
-                    self.limiting_cone_angle = Some(attr.parse_to_parse_error(value)?)
+                    self.limiting_cone_angle = Some(attr.parse(value)?)
                 }
 
                 _ => (),
diff --git a/rsvg_internals/src/filters/light/lighting.rs b/rsvg_internals/src/filters/light/lighting.rs
index 321f4ac9..8dec0f32 100644
--- a/rsvg_internals/src/filters/light/lighting.rs
+++ b/rsvg_internals/src/filters/light/lighting.rs
@@ -12,19 +12,32 @@ use crate::error::*;
 use crate::filters::{
     context::{FilterContext, FilterOutput, FilterResult},
     light::{
-        bottom_left_normal, bottom_right_normal, bottom_row_normal, interior_normal,
-        left_column_normal, light_source::FeDistantLight, light_source::FePointLight,
-        light_source::FeSpotLight, light_source::LightSource, right_column_normal, top_left_normal,
-        top_right_normal, top_row_normal, Normal,
+        bottom_left_normal,
+        bottom_right_normal,
+        bottom_row_normal,
+        interior_normal,
+        left_column_normal,
+        light_source::FeDistantLight,
+        light_source::FePointLight,
+        light_source::FeSpotLight,
+        light_source::LightSource,
+        right_column_normal,
+        top_left_normal,
+        top_right_normal,
+        top_row_normal,
+        Normal,
     },
-    FilterEffect, FilterError, PrimitiveWithInput,
+    FilterEffect,
+    FilterError,
+    PrimitiveWithInput,
 };
 use crate::node::{CascadedValues, NodeResult, NodeTrait, NodeType, RsvgNode};
-use crate::parsers::{NumberOptionalNumber, ParseValueToParseError};
+use crate::parsers::{NumberOptionalNumber, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::{
     shared_surface::{SharedImageSurface, SurfaceType},
-    ImageSurfaceDataExt, Pixel,
+    ImageSurfaceDataExt,
+    Pixel,
 };
 use crate::util::clamp;
 
@@ -54,14 +67,11 @@ impl Common {
 
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "surfaceScale") => {
-                    self.surface_scale = attr.parse_to_parse_error(value)?
-                }
+                expanded_name!(svg "surfaceScale") => self.surface_scale = attr.parse(value)?,
 
                 expanded_name!(svg "kernelUnitLength") => {
-                    let NumberOptionalNumber(x, y) = attr.parse_to_parse_error_and_validate(
-                        value,
-                        |v: NumberOptionalNumber<f64>| {
+                    let NumberOptionalNumber(x, y) =
+                        attr.parse_and_validate(value, |v: NumberOptionalNumber<f64>| {
                             if v.0 > 0.0 && v.1 > 0.0 {
                                 Ok(v)
                             } else {
@@ -69,8 +79,7 @@ impl Common {
                                     "kernelUnitLength can't be less or equal to zero",
                                 ))
                             }
-                        },
-                    )?;
+                        })?;
 
                     self.kernel_unit_length = Some((x, y));
                 }
@@ -106,7 +115,7 @@ impl NodeTrait for FeDiffuseLighting {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "diffuseConstant") => {
-                    self.diffuse_constant = attr.parse_to_parse_error_and_validate(value, |x| {
+                    self.diffuse_constant = attr.parse_and_validate(value, |x| {
                         if x >= 0.0 {
                             Ok(x)
                         } else {
@@ -175,28 +184,26 @@ impl NodeTrait for FeSpecularLighting {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "specularConstant") => {
-                    self.specular_constant =
-                        attr.parse_to_parse_error_and_validate(value, |x| {
-                            if x >= 0.0 {
-                                Ok(x)
-                            } else {
-                                Err(ValueErrorKind::value_error(
-                                    "specularConstant can't be negative",
-                                ))
-                            }
-                        })?;
+                    self.specular_constant = attr.parse_and_validate(value, |x| {
+                        if x >= 0.0 {
+                            Ok(x)
+                        } else {
+                            Err(ValueErrorKind::value_error(
+                                "specularConstant can't be negative",
+                            ))
+                        }
+                    })?;
                 }
                 expanded_name!(svg "specularExponent") => {
-                    self.specular_exponent =
-                        attr.parse_to_parse_error_and_validate(value, |x| {
-                            if x >= 1.0 && x <= 128.0 {
-                                Ok(x)
-                            } else {
-                                Err(ValueErrorKind::value_error(
-                                    "specularExponent should be between 1.0 and 128.0",
-                                ))
-                            }
-                        })?;
+                    self.specular_exponent = attr.parse_and_validate(value, |x| {
+                        if x >= 1.0 && x <= 128.0 {
+                            Ok(x)
+                        } else {
+                            Err(ValueErrorKind::value_error(
+                                "specularExponent should be between 1.0 and 128.0",
+                            ))
+                        }
+                    })?;
                 }
                 _ => (),
             }
@@ -294,8 +301,8 @@ macro_rules! impl_lighting_filter {
 
                 let (bounds_w, bounds_h) = bounds.size();
 
-                // Check if the surface is too small for normal computation. This case is unspecified;
-                // WebKit doesn't render anything in this case.
+                // Check if the surface is too small for normal computation. This case is
+                // unspecified; WebKit doesn't render anything in this case.
                 if bounds_w < 2 || bounds_h < 2 {
                     return Err(FilterError::LightingInputTooSmall);
                 }
diff --git a/rsvg_internals/src/filters/merge.rs b/rsvg_internals/src/filters/merge.rs
index 0f6d821e..eb47e735 100644
--- a/rsvg_internals/src/filters/merge.rs
+++ b/rsvg_internals/src/filters/merge.rs
@@ -3,7 +3,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::drawing_ctx::DrawingCtx;
 use crate::node::{NodeResult, NodeTrait, NodeType, RsvgNode};
-use crate::parsers::ParseValueToParseError;
+use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 use crate::rect::IRect;
 use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
@@ -47,7 +47,7 @@ impl NodeTrait for FeMergeNode {
     fn set_atts(&mut self, _parent: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "in") => self.in_ = Some(attr.parse_to_parse_error(value)?),
+                expanded_name!(svg "in") => self.in_ = Some(attr.parse(value)?),
                 _ => (),
             }
         }
diff --git a/rsvg_internals/src/filters/mod.rs b/rsvg_internals/src/filters/mod.rs
index 71c8b638..ce6b5538 100644
--- a/rsvg_internals/src/filters/mod.rs
+++ b/rsvg_internals/src/filters/mod.rs
@@ -13,7 +13,7 @@ use crate::error::{RenderingError, ValueErrorKind};
 use crate::filter::Filter;
 use crate::length::*;
 use crate::node::{CascadedValues, NodeResult, NodeTrait, NodeType, RsvgNode};
-use crate::parsers::ParseValueToParseError;
+use crate::parsers::ParseValue;
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
 use crate::property_defs::ColorInterpolationFilters;
@@ -163,26 +163,26 @@ impl NodeTrait for Primitive {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "x") => {
-                    self.x = Some(attr.parse_to_parse_error_and_validate(value, check_units_horizontal)?)
+                    self.x = Some(attr.parse_and_validate(value, check_units_horizontal)?)
                 }
                 expanded_name!(svg "y") => {
-                    self.y = Some(attr.parse_to_parse_error_and_validate(value, check_units_vertical)?)
+                    self.y = Some(attr.parse_and_validate(value, check_units_vertical)?)
                 }
                 expanded_name!(svg "width") => {
                     self.width =
-                        Some(attr.parse_to_parse_error_and_validate(
+                        Some(attr.parse_and_validate(
                             value,
                             check_units_horizontal_and_ensure_nonnegative,
                         )?)
                 }
                 expanded_name!(svg "height") => {
                     self.height =
-                        Some(attr.parse_to_parse_error_and_validate(
+                        Some(attr.parse_and_validate(
                             value,
                             check_units_vertical_and_ensure_nonnegative,
                         )?)
                 }
-                expanded_name!(svg "result") => self.result = Some(attr.parse_to_parse_error(value)?),
+                expanded_name!(svg "result") => self.result = Some(attr.parse(value)?),
                 _ => (),
             }
         }
@@ -218,7 +218,7 @@ impl NodeTrait for PrimitiveWithInput {
 
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "in") => self.in_ = Some(attr.parse_to_parse_error(value)?),
+                expanded_name!(svg "in") => self.in_ = Some(attr.parse(value)?),
                 _ => (),
             }
         }
@@ -350,7 +350,7 @@ pub fn render(
 }
 
 impl From<ColorInterpolationFilters> for SurfaceType {
-   fn from(c: ColorInterpolationFilters) -> Self {
+    fn from(c: ColorInterpolationFilters) -> Self {
         match c {
             ColorInterpolationFilters::LinearRgb => SurfaceType::LinearRgb,
             _ => SurfaceType::SRgb,
diff --git a/rsvg_internals/src/filters/morphology.rs b/rsvg_internals/src/filters/morphology.rs
index 2b33b70f..df69af05 100644
--- a/rsvg_internals/src/filters/morphology.rs
+++ b/rsvg_internals/src/filters/morphology.rs
@@ -7,13 +7,15 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::{NumberOptionalNumber, ParseToParseError, ParseValueToParseError};
+use crate::parsers::{NumberOptionalNumber, Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::rect::IRect;
 use crate::surface_utils::{
     iterators::{PixelRectangle, Pixels},
     shared_surface::SharedImageSurface,
-    EdgeMode, ImageSurfaceDataExt, Pixel,
+    EdgeMode,
+    ImageSurfaceDataExt,
+    Pixel,
 };
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
@@ -52,18 +54,16 @@ impl NodeTrait for FeMorphology {
 
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "operator") => self.operator = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "operator") => self.operator = attr.parse(value)?,
                 expanded_name!(svg "radius") => {
-                    let NumberOptionalNumber(x, y) = attr.parse_to_parse_error_and_validate(
-                        value,
-                        |v: NumberOptionalNumber<f64>| {
+                    let NumberOptionalNumber(x, y) =
+                        attr.parse_and_validate(value, |v: NumberOptionalNumber<f64>| {
                             if v.0 >= 0.0 && v.1 >= 0.0 {
                                 Ok(v)
                             } else {
                                 Err(ValueErrorKind::value_error("radius cannot be negative"))
                             }
-                        }
-                    )?;
+                        })?;
 
                     self.radius = (x, y);
                 }
@@ -161,8 +161,8 @@ impl FilterEffect for FeMorphology {
     }
 }
 
-impl ParseToParseError for Operator {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for Operator {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "erode" => Operator::Erode,
diff --git a/rsvg_internals/src/filters/offset.rs b/rsvg_internals/src/filters/offset.rs
index 150b9008..6ef31dc6 100644
--- a/rsvg_internals/src/filters/offset.rs
+++ b/rsvg_internals/src/filters/offset.rs
@@ -3,7 +3,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::drawing_ctx::DrawingCtx;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::ParseValueToParseError;
+use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::shared_surface::SharedImageSurface;
 
@@ -37,8 +37,8 @@ impl NodeTrait for FeOffset {
 
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "dx") => self.dx = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "dy") => self.dy = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "dx") => self.dx = attr.parse(value)?,
+                expanded_name!(svg "dy") => self.dy = attr.parse(value)?,
                 _ => (),
             }
         }
diff --git a/rsvg_internals/src/filters/turbulence.rs b/rsvg_internals/src/filters/turbulence.rs
index c81bc97b..c90d5d00 100644
--- a/rsvg_internals/src/filters/turbulence.rs
+++ b/rsvg_internals/src/filters/turbulence.rs
@@ -5,11 +5,12 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{CascadedValues, NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::{NumberOptionalNumber, ParseToParseError, ParseValueToParseError};
+use crate::parsers::{NumberOptionalNumber, Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::{
     shared_surface::{SharedImageSurface, SurfaceType},
-    ImageSurfaceDataExt, Pixel,
+    ImageSurfaceDataExt,
+    Pixel,
 };
 use crate::util::clamp;
 
@@ -65,35 +66,31 @@ impl NodeTrait for FeTurbulence {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "baseFrequency") => {
-                    let NumberOptionalNumber(x, y) = attr.parse_to_parse_error_and_validate(
-                        value,
-                        |v: NumberOptionalNumber<f64>| {
+                    let NumberOptionalNumber(x, y) =
+                        attr.parse_and_validate(value, |v: NumberOptionalNumber<f64>| {
                             if v.0 >= 0.0 && v.1 >= 0.0 {
                                 Ok(v)
                             } else {
                                 Err(ValueErrorKind::value_error("values can't be negative"))
                             }
-                        },
-                    )?;
+                        })?;
 
                     self.base_frequency = (x, y);
                 }
                 expanded_name!(svg "numOctaves") => {
-                    self.num_octaves = attr.parse_to_parse_error(value)?;
+                    self.num_octaves = attr.parse(value)?;
                 }
                 // Yes, seed needs to be parsed as a number and then truncated.
                 expanded_name!(svg "seed") => {
-                    let v: f64 = attr.parse_to_parse_error(value)?;
+                    let v: f64 = attr.parse(value)?;
                     self.seed = clamp(
                         v.trunc(),
                         f64::from(i32::min_value()),
                         f64::from(i32::max_value()),
                     ) as i32;
                 }
-                expanded_name!(svg "stitchTiles") => {
-                    self.stitch_tiles = attr.parse_to_parse_error(value)?
-                }
-                expanded_name!(svg "type") => self.type_ = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "stitchTiles") => self.stitch_tiles = attr.parse(value)?,
+                expanded_name!(svg "type") => self.type_ = attr.parse(value)?,
                 _ => (),
             }
         }
@@ -422,8 +419,8 @@ impl FilterEffect for FeTurbulence {
     }
 }
 
-impl ParseToParseError for StitchTiles {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for StitchTiles {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "stitch" => StitchTiles::Stitch,
@@ -432,8 +429,8 @@ impl ParseToParseError for StitchTiles {
     }
 }
 
-impl ParseToParseError for NoiseType {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for NoiseType {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "fractalNoise" => NoiseType::FractalNoise,
diff --git a/rsvg_internals/src/font_props.rs b/rsvg_internals/src/font_props.rs
index b4be79ac..e8c9c94e 100644
--- a/rsvg_internals/src/font_props.rs
+++ b/rsvg_internals/src/font_props.rs
@@ -5,7 +5,7 @@ use cssparser::{BasicParseError, Parser};
 use crate::drawing_ctx::ViewParams;
 use crate::error::*;
 use crate::length::*;
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 use crate::properties::ComputedValues;
 
 // https://www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#propdef-font-size
@@ -60,12 +60,10 @@ impl FontSizeSpec {
     }
 }
 
-impl ParseToParseError for FontSizeSpec {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<FontSizeSpec, CssParseError<'i>> {
+impl Parse for FontSizeSpec {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<FontSizeSpec, CssParseError<'i>> {
         parser
-            .try_parse(|p| Length::<Both>::parse_to_parse_error(p))
+            .try_parse(|p| Length::<Both>::parse(p))
             .and_then(|l| Ok(FontSizeSpec::Value(l)))
             .or_else(|_| {
                 Ok(parse_identifiers!(
@@ -102,8 +100,8 @@ pub enum FontWeightSpec {
     W900,
 }
 
-impl ParseToParseError for FontWeightSpec {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<FontWeightSpec, CssParseError<'i>> {
+impl Parse for FontWeightSpec {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<FontWeightSpec, CssParseError<'i>> {
         parser
             .try_parse(|p| {
                 Ok(parse_identifiers!(
@@ -129,7 +127,7 @@ impl ParseToParseError for FontWeightSpec {
                         700 => Ok(FontWeightSpec::W700),
                         800 => Ok(FontWeightSpec::W800),
                         900 => Ok(FontWeightSpec::W900),
-                        _ => Err(loc.new_custom_error(ValueErrorKind::parse_error("parse error")))
+                        _ => Err(loc.new_custom_error(ValueErrorKind::parse_error("parse error"))),
                     })
             })
     }
@@ -164,12 +162,10 @@ impl LetterSpacingSpec {
     }
 }
 
-impl ParseToParseError for LetterSpacingSpec {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<LetterSpacingSpec, CssParseError<'i>> {
+impl Parse for LetterSpacingSpec {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<LetterSpacingSpec, CssParseError<'i>> {
         parser
-            .try_parse(|p| Length::<Horizontal>::parse_to_parse_error(p))
+            .try_parse(|p| Length::<Horizontal>::parse(p))
             .and_then(|l| Ok(LetterSpacingSpec::Value(l)))
             .or_else(|_| {
                 Ok(parse_identifiers!(
@@ -184,10 +180,8 @@ impl ParseToParseError for LetterSpacingSpec {
 #[derive(Debug, Clone, PartialEq)]
 pub struct SingleFontFamily(pub String);
 
-impl ParseToParseError for SingleFontFamily {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<SingleFontFamily, CssParseError<'i>> {
+impl Parse for SingleFontFamily {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<SingleFontFamily, CssParseError<'i>> {
         let loc = parser.current_source_location();
 
         if let Ok(cow) = parser.try_parse(|p| p.expect_string_cloned()) {
@@ -219,41 +213,41 @@ mod tests {
 
     #[test]
     fn detects_invalid_invalid_font_size() {
-        assert!(FontSizeSpec::parse_str_to_parse_error("furlong").is_err());
+        assert!(FontSizeSpec::parse_str("furlong").is_err());
     }
 
     #[test]
     fn parses_font_weight() {
         assert_eq!(
-            <FontWeightSpec as ParseToParseError>::parse_str_to_parse_error("normal"),
+            <FontWeightSpec as Parse>::parse_str("normal"),
             Ok(FontWeightSpec::Normal)
         );
         assert_eq!(
-            <FontWeightSpec as ParseToParseError>::parse_str_to_parse_error("bold"),
+            <FontWeightSpec as Parse>::parse_str("bold"),
             Ok(FontWeightSpec::Bold)
         );
         assert_eq!(
-            <FontWeightSpec as ParseToParseError>::parse_str_to_parse_error("100"),
+            <FontWeightSpec as Parse>::parse_str("100"),
             Ok(FontWeightSpec::W100)
         );
     }
 
     #[test]
     fn detects_invalid_font_weight() {
-        assert!(<FontWeightSpec as ParseToParseError>::parse_str_to_parse_error("").is_err());
-        assert!(<FontWeightSpec as ParseToParseError>::parse_str_to_parse_error("strange").is_err());
-        assert!(<FontWeightSpec as ParseToParseError>::parse_str_to_parse_error("314").is_err());
-        assert!(<FontWeightSpec as ParseToParseError>::parse_str_to_parse_error("3.14").is_err());
+        assert!(<FontWeightSpec as Parse>::parse_str("").is_err());
+        assert!(<FontWeightSpec as Parse>::parse_str("strange").is_err());
+        assert!(<FontWeightSpec as Parse>::parse_str("314").is_err());
+        assert!(<FontWeightSpec as Parse>::parse_str("3.14").is_err());
     }
 
     #[test]
     fn parses_letter_spacing() {
         assert_eq!(
-            <LetterSpacingSpec as ParseToParseError>::parse_str_to_parse_error("normal"),
+            <LetterSpacingSpec as Parse>::parse_str("normal"),
             Ok(LetterSpacingSpec::Normal)
         );
         assert_eq!(
-            <LetterSpacingSpec as ParseToParseError>::parse_str_to_parse_error("10em"),
+            <LetterSpacingSpec as Parse>::parse_str("10em"),
             Ok(LetterSpacingSpec::Value(Length::<Horizontal>::new(
                 10.0,
                 LengthUnit::Em,
@@ -264,16 +258,14 @@ mod tests {
     #[test]
     fn computes_letter_spacing() {
         assert_eq!(
-            <LetterSpacingSpec as ParseToParseError>::parse_str_to_parse_error("normal")
-                .map(|s| s.compute()),
+            <LetterSpacingSpec as Parse>::parse_str("normal").map(|s| s.compute()),
             Ok(LetterSpacingSpec::Value(Length::<Horizontal>::new(
                 0.0,
                 LengthUnit::Px,
             )))
         );
         assert_eq!(
-            <LetterSpacingSpec as ParseToParseError>::parse_str_to_parse_error("10em")
-                .map(|s| s.compute()),
+            <LetterSpacingSpec as Parse>::parse_str("10em").map(|s| s.compute()),
             Ok(LetterSpacingSpec::Value(Length::<Horizontal>::new(
                 10.0,
                 LengthUnit::Em,
@@ -283,36 +275,36 @@ mod tests {
 
     #[test]
     fn detects_invalid_invalid_letter_spacing() {
-        assert!(LetterSpacingSpec::parse_str_to_parse_error("furlong").is_err());
+        assert!(LetterSpacingSpec::parse_str("furlong").is_err());
     }
 
     #[test]
     fn parses_font_family() {
         assert_eq!(
-            <SingleFontFamily as ParseToParseError>::parse_str_to_parse_error("'Hello world'"),
+            <SingleFontFamily as Parse>::parse_str("'Hello world'"),
             Ok(SingleFontFamily("Hello world".to_owned()))
         );
 
         assert_eq!(
-            <SingleFontFamily as ParseToParseError>::parse_str_to_parse_error("\"Hello world\""),
+            <SingleFontFamily as Parse>::parse_str("\"Hello world\""),
             Ok(SingleFontFamily("Hello world".to_owned()))
         );
 
         assert_eq!(
-            <SingleFontFamily as ParseToParseError>::parse_str_to_parse_error("  Hello  world  "),
+            <SingleFontFamily as Parse>::parse_str("  Hello  world  "),
             Ok(SingleFontFamily("Hello world".to_owned()))
         );
 
         assert_eq!(
-            <SingleFontFamily as ParseToParseError>::parse_str_to_parse_error("Plonk"),
+            <SingleFontFamily as Parse>::parse_str("Plonk"),
             Ok(SingleFontFamily("Plonk".to_owned()))
         );
     }
 
     #[test]
     fn detects_invalid_font_family() {
-        assert!(<SingleFontFamily as ParseToParseError>::parse_str_to_parse_error("").is_err());
-        assert!(<SingleFontFamily as ParseToParseError>::parse_str_to_parse_error("''").is_err());
-        assert!(<SingleFontFamily as ParseToParseError>::parse_str_to_parse_error("42").is_err());
+        assert!(<SingleFontFamily as Parse>::parse_str("").is_err());
+        assert!(<SingleFontFamily as Parse>::parse_str("''").is_err());
+        assert!(<SingleFontFamily as Parse>::parse_str("42").is_err());
     }
 }
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index fcdcdcb6..5b2befcd 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -13,7 +13,7 @@ use crate::error::*;
 use crate::length::*;
 use crate::node::{CascadedValues, NodeResult, NodeTrait, NodeType, RsvgNode};
 use crate::paint_server::{AsPaintSource, PaintSource};
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
 use crate::property_defs::StopColor;
@@ -43,8 +43,8 @@ enum SpreadMethod {
     Repeat,
 }
 
-impl ParseToParseError for SpreadMethod {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<SpreadMethod, CssParseError<'i>> {
+impl Parse for SpreadMethod {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<SpreadMethod, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "pad" => SpreadMethod::Pad,
@@ -114,9 +114,8 @@ fn fix_focus_point(fx: f64, fy: f64, cx: f64, cy: f64, radius: f64) -> (f64, f64
 pub struct Stop {
     /// <stop offset="..."/>
     offset: UnitInterval,
-
-    // stop-color and stop-opacity are not attributes; they are properties, so
-    // they go into property_defs.rs
+    /* stop-color and stop-opacity are not attributes; they are properties, so
+     * they go into property_defs.rs */
 }
 
 fn validate_offset(length: Length<Both>) -> Result<Length<Both>, ValueErrorKind> {
@@ -134,7 +133,7 @@ impl NodeTrait for Stop {
             match attr.expanded() {
                 expanded_name!(svg "offset") => {
                     self.offset = attr
-                        .parse_to_parse_error_and_validate(value, validate_offset)
+                        .parse_and_validate(value, validate_offset)
                         .map(|l| UnitInterval::clamp(l.length))?
                 }
                 _ => (),
@@ -222,16 +221,31 @@ impl UnresolvedVariant {
 
     fn resolve_from_fallback(&self, fallback: &UnresolvedVariant) -> UnresolvedVariant {
         match (*self, *fallback) {
-            (UnresolvedVariant::Linear { x1, y1, x2, y2 },
-             UnresolvedVariant::Linear { x1: fx1, y1: fy1, x2: fx2, y2: fy2 }) => UnresolvedVariant::Linear {
+            (
+                UnresolvedVariant::Linear { x1, y1, x2, y2 },
+                UnresolvedVariant::Linear {
+                    x1: fx1,
+                    y1: fy1,
+                    x2: fx2,
+                    y2: fy2,
+                },
+            ) => UnresolvedVariant::Linear {
                 x1: x1.or(fx1),
                 y1: y1.or(fy1),
                 x2: x2.or(fx2),
                 y2: y2.or(fy2),
             },
 
-            (UnresolvedVariant::Radial { cx, cy, r, fx, fy },
-             UnresolvedVariant::Radial { cx: fcx, cy: fcy, r: fr, fx: ffx, fy: ffy }) => 
UnresolvedVariant::Radial {
+            (
+                UnresolvedVariant::Radial { cx, cy, r, fx, fy },
+                UnresolvedVariant::Radial {
+                    cx: fcx,
+                    cy: fcy,
+                    r: fr,
+                    fx: ffx,
+                    fy: ffy,
+                },
+            ) => UnresolvedVariant::Radial {
                 cx: cx.or(fcx),
                 cy: cy.or(fcy),
                 r: r.or(fr),
@@ -248,23 +262,23 @@ impl UnresolvedVariant {
     fn resolve_from_defaults(&self) -> UnresolvedVariant {
         match self {
             UnresolvedVariant::Linear { x1, y1, x2, y2 } => UnresolvedVariant::Linear {
-                x1: x1.or_else(|| Some(Length::<Horizontal>::parse_str_to_parse_error("0%").unwrap())),
-                y1: y1.or_else(|| Some(Length::<Vertical>::parse_str_to_parse_error("0%").unwrap())),
-                x2: x2.or_else(|| Some(Length::<Horizontal>::parse_str_to_parse_error("100%").unwrap())),
-                y2: y2.or_else(|| Some(Length::<Vertical>::parse_str_to_parse_error("0%").unwrap())),
+                x1: x1.or_else(|| Some(Length::<Horizontal>::parse_str("0%").unwrap())),
+                y1: y1.or_else(|| Some(Length::<Vertical>::parse_str("0%").unwrap())),
+                x2: x2.or_else(|| Some(Length::<Horizontal>::parse_str("100%").unwrap())),
+                y2: y2.or_else(|| Some(Length::<Vertical>::parse_str("0%").unwrap())),
             },
 
             UnresolvedVariant::Radial { cx, cy, r, fx, fy } => {
-                let cx = cx.or_else(|| Some(Length::<Horizontal>::parse_str_to_parse_error("50%").unwrap()));
-                let cy = cy.or_else(|| Some(Length::<Vertical>::parse_str_to_parse_error("50%").unwrap()));
-                let r = r.or_else(|| Some(Length::<Both>::parse_str_to_parse_error("50%").unwrap()));
+                let cx = cx.or_else(|| Some(Length::<Horizontal>::parse_str("50%").unwrap()));
+                let cy = cy.or_else(|| Some(Length::<Vertical>::parse_str("50%").unwrap()));
+                let r = r.or_else(|| Some(Length::<Both>::parse_str("50%").unwrap()));
 
                 // fx and fy fall back to the presentational value of cx and cy
                 let fx = fx.or(cx);
                 let fy = fy.or(cy);
 
                 UnresolvedVariant::Radial { cx, cy, r, fx, fy }
-            },
+            }
         }
     }
 }
@@ -472,7 +486,13 @@ impl UnresolvedGradient {
         let stops = self.stops.clone().or_else(|| fallback.stops.clone());
         let variant = self.variant.resolve_from_fallback(&fallback.variant);
 
-        UnresolvedGradient { units, affine, spread, stops, variant }
+        UnresolvedGradient {
+            units,
+            affine,
+            spread,
+            stops,
+            variant,
+        }
     }
 
     fn resolve_from_defaults(&self) -> UnresolvedGradient {
@@ -482,7 +502,13 @@ impl UnresolvedGradient {
         let stops = self.stops.clone().or_else(|| Some(Vec::<ColorStop>::new()));
         let variant = self.variant.resolve_from_defaults();
 
-        UnresolvedGradient { units, affine, spread, stops, variant }
+        UnresolvedGradient {
+            units,
+            affine,
+            spread,
+            stops,
+            variant,
+        }
     }
 }
 
@@ -539,7 +565,7 @@ macro_rules! impl_get_unresolved {
                 }
             }
         }
-    }
+    };
 }
 impl_get_unresolved!(LinearGradient);
 impl_get_unresolved!(RadialGradient);
@@ -548,9 +574,9 @@ impl Common {
     fn set_atts(&mut self, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "gradientUnits") => self.units = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "gradientTransform") => self.affine = 
Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "spreadMethod") => self.spread = Some(attr.parse_to_parse_error(value)?),
+                expanded_name!(svg "gradientUnits") => self.units = Some(attr.parse(value)?),
+                expanded_name!(svg "gradientTransform") => self.affine = Some(attr.parse(value)?),
+                expanded_name!(svg "spreadMethod") => self.spread = Some(attr.parse(value)?),
                 expanded_name!(xlink "href") => {
                     self.fallback = Some(Fragment::parse(value).attribute(attr)?)
                 }
@@ -568,10 +594,10 @@ impl NodeTrait for LinearGradient {
 
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "x1") => self.x1 = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "y1") => self.y1 = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "x2") => self.x2 = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "y2") => self.y2 = Some(attr.parse_to_parse_error(value)?),
+                expanded_name!(svg "x1") => self.x1 = Some(attr.parse(value)?),
+                expanded_name!(svg "y1") => self.y1 = Some(attr.parse(value)?),
+                expanded_name!(svg "x2") => self.x2 = Some(attr.parse(value)?),
+                expanded_name!(svg "y2") => self.y2 = Some(attr.parse(value)?),
 
                 _ => (),
             }
@@ -587,11 +613,11 @@ impl NodeTrait for RadialGradient {
 
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "cx") => self.cx = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "cy") => self.cy = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "r") => self.r = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "fx") => self.fx = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "fy") => self.fy = Some(attr.parse_to_parse_error(value)?),
+                expanded_name!(svg "cx") => self.cx = Some(attr.parse(value)?),
+                expanded_name!(svg "cy") => self.cy = Some(attr.parse(value)?),
+                expanded_name!(svg "r") => self.r = Some(attr.parse(value)?),
+                expanded_name!(svg "fx") => self.fx = Some(attr.parse(value)?),
+                expanded_name!(svg "fy") => self.fy = Some(attr.parse(value)?),
 
                 _ => (),
             }
@@ -616,7 +642,10 @@ macro_rules! impl_paint_source {
                     return Ok(gradient.clone());
                 }
 
-                let Unresolved { mut gradient, mut fallback } = self.get_unresolved(node);
+                let Unresolved {
+                    mut gradient,
+                    mut fallback,
+                } = self.get_unresolved(node);
 
                 let mut stack = NodeStack::new();
 
@@ -641,7 +670,7 @@ macro_rules! impl_paint_source {
                                 a_gradient.get_unresolved(&acquired_node)
                             }
 
-                            _ => unreachable!()
+                            _ => unreachable!(),
                         };
 
                         gradient = gradient.resolve_from_fallback(&unresolved.gradient);
@@ -661,7 +690,7 @@ macro_rules! impl_paint_source {
                 Ok(gradient)
             }
         }
-    }
+    };
 }
 
 impl_paint_source!(
@@ -769,25 +798,28 @@ fn acquire_gradient<'a>(
     draw_ctx: &'a mut DrawingCtx,
     fragment: &Fragment,
 ) -> Result<AcquiredNode, AcquireError> {
-    draw_ctx.acquire_node(fragment, &[NodeType::LinearGradient, NodeType::RadialGradient])
+    draw_ctx.acquire_node(
+        fragment,
+        &[NodeType::LinearGradient, NodeType::RadialGradient],
+    )
 }
 
 #[cfg(test)]
 mod tests {
     use super::*;
-    use markup5ever::{namespace_url, ns, QualName};
     use crate::float_eq_cairo::ApproxEqCairo;
     use crate::node::{NodeData, NodeType, RsvgNode};
+    use markup5ever::{namespace_url, ns, QualName};
 
     #[test]
     fn parses_spread_method() {
-        assert_eq!(SpreadMethod::parse_str_to_parse_error("pad"), Ok(SpreadMethod::Pad));
+        assert_eq!(SpreadMethod::parse_str("pad"), Ok(SpreadMethod::Pad));
         assert_eq!(
-            SpreadMethod::parse_str_to_parse_error("reflect"),
+            SpreadMethod::parse_str("reflect"),
             Ok(SpreadMethod::Reflect)
         );
-        assert_eq!(SpreadMethod::parse_str_to_parse_error("repeat"), Ok(SpreadMethod::Repeat));
-        assert!(SpreadMethod::parse_str_to_parse_error("foobar").is_err());
+        assert_eq!(SpreadMethod::parse_str("repeat"), Ok(SpreadMethod::Repeat));
+        assert!(SpreadMethod::parse_str("foobar").is_err());
     }
 
     fn assert_tuples_equal(a: &(f64, f64), b: &(f64, f64)) {
@@ -814,7 +846,7 @@ mod tests {
             &QualName::new(None, ns!(svg), local_name!("linearGradient")),
             None,
             None,
-            Box::new(LinearGradient::default())
+            Box::new(LinearGradient::default()),
         ));
 
         let borrow = node.borrow();
@@ -828,7 +860,7 @@ mod tests {
             &QualName::new(None, ns!(svg), local_name!("radialGradient")),
             None,
             None,
-            Box::new(RadialGradient::default())
+            Box::new(RadialGradient::default()),
         ));
 
         let borrow = node.borrow();
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index face86c2..b7737473 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -35,7 +35,8 @@ pub struct LoadOptions {
     /// Whether to keep original (undecoded) image data to embed in Cairo PDF surfaces.
     pub keep_image_data: bool,
 
-    /// The environment's locale, used for the `<switch>` element and the `systemLanguage` attribute.
+    /// The environment's locale, used for the `<switch>` element and the `systemLanguage`
+    /// attribute.
     locale: Locale,
 }
 
@@ -206,7 +207,11 @@ impl Handle {
         cancellable: Option<&gio::Cancellable>,
     ) -> Result<Handle, LoadingError> {
         Ok(Handle {
-            document: Rc::new(Document::load_from_stream(load_options, stream, cancellable)?),
+            document: Rc::new(Document::load_from_stream(
+                load_options,
+                stream,
+                cancellable,
+            )?),
         })
     }
 
@@ -318,7 +323,10 @@ impl Handle {
         let ink_rect = bbox.ink_rect.unwrap_or_default();
         let logical_rect = bbox.rect.unwrap_or_default();
 
-        Ok((cairo::Rectangle::from(ink_rect), cairo::Rectangle::from(logical_rect)))
+        Ok((
+            cairo::Rectangle::from(ink_rect),
+            cairo::Rectangle::from(logical_rect),
+        ))
     }
 
     /// Returns (ink_rect, logical_rect)
diff --git a/rsvg_internals/src/image.rs b/rsvg_internals/src/image.rs
index b16230d3..514f36fb 100644
--- a/rsvg_internals/src/image.rs
+++ b/rsvg_internals/src/image.rs
@@ -11,7 +11,7 @@ use crate::error::*;
 use crate::float_eq_cairo::ApproxEqCairo;
 use crate::length::*;
 use crate::node::*;
-use crate::parsers::ParseValueToParseError;
+use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 use crate::rect::Rect;
 use crate::viewbox::ViewBox;
@@ -30,15 +30,15 @@ impl NodeTrait for Image {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "x") => self.x = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "y") => self.y = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "x") => self.x = attr.parse(value)?,
+                expanded_name!(svg "y") => self.y = attr.parse(value)?,
                 expanded_name!(svg "width") => {
-                    self.w = attr.parse_to_parse_error_and_validate(value, Length::check_nonnegative)?
+                    self.w = attr.parse_and_validate(value, Length::check_nonnegative)?
                 }
                 expanded_name!(svg "height") => {
-                    self.h = attr.parse_to_parse_error_and_validate(value, Length::check_nonnegative)?
+                    self.h = attr.parse_and_validate(value, Length::check_nonnegative)?
                 }
-                expanded_name!(svg "preserveAspectRatio") => self.aspect = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "preserveAspectRatio") => self.aspect = attr.parse(value)?,
 
                 // "path" is used by some older Adobe Illustrator versions
                 expanded_name!(xlink "href") | expanded_name!(svg "path") => {
diff --git a/rsvg_internals/src/io.rs b/rsvg_internals/src/io.rs
index 53b4992f..a48074e2 100644
--- a/rsvg_internals/src/io.rs
+++ b/rsvg_internals/src/io.rs
@@ -63,7 +63,9 @@ pub fn get_input_stream_for_loading(
     let num_read = buffered.fill(2, cancellable)?;
     if num_read < 2 {
         // FIXME: this string was localized in the original; localize it
-        return Err(LoadingError::XmlParseError(String::from("Input file is too short")));
+        return Err(LoadingError::XmlParseError(String::from(
+            "Input file is too short",
+        )));
     }
 
     let buf = buffered.peek_buffer();
@@ -87,13 +89,13 @@ pub fn acquire_stream(
     if uri.starts_with("data:") {
         let BinaryData { data, .. } = decode_data_uri(uri)?;
 
-//        {
-//            use std::fs::File;
-//            use std::io::prelude::*;
-//
-//            let mut file = File::create("data.bin").unwrap();
-//            file.write_all(&data).unwrap();
-//        }
+        //        {
+        //            use std::fs::File;
+        //            use std::io::prelude::*;
+        //
+        //            let mut file = File::create("data.bin").unwrap();
+        //            file.write_all(&data).unwrap();
+        //        }
 
         let stream = MemoryInputStream::new_from_bytes(&GBytes::from_owned(data));
         Ok(stream.upcast::<InputStream>())
diff --git a/rsvg_internals/src/iri.rs b/rsvg_internals/src/iri.rs
index 2984fee0..4ab2a3dc 100644
--- a/rsvg_internals/src/iri.rs
+++ b/rsvg_internals/src/iri.rs
@@ -4,7 +4,7 @@ use cssparser::Parser;
 
 use crate::allowed_url::{Fragment, Href};
 use crate::error::*;
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 
 /// Used where style properties take a funciri or "none"
 ///
@@ -34,8 +34,8 @@ impl IRI {
     }
 }
 
-impl ParseToParseError for IRI {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<IRI, CssParseError<'i>> {
+impl Parse for IRI {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<IRI, CssParseError<'i>> {
         if parser
             .try_parse(|i| i.expect_ident_matching("none"))
             .is_ok()
@@ -67,18 +67,18 @@ mod tests {
 
     #[test]
     fn parses_none() {
-        assert_eq!(IRI::parse_str_to_parse_error("none"), Ok(IRI::None));
+        assert_eq!(IRI::parse_str("none"), Ok(IRI::None));
     }
 
     #[test]
     fn parses_url() {
         assert_eq!(
-            IRI::parse_str_to_parse_error("url(#bar)"),
+            IRI::parse_str("url(#bar)"),
             Ok(IRI::Resource(Fragment::new(None, "bar".to_string())))
         );
 
         assert_eq!(
-            IRI::parse_str_to_parse_error("url(foo#bar)"),
+            IRI::parse_str("url(foo#bar)"),
             Ok(IRI::Resource(Fragment::new(
                 Some("foo".to_string()),
                 "bar".to_string()
@@ -87,19 +87,19 @@ mod tests {
 
         // be permissive if the closing ) is missing
         assert_eq!(
-            IRI::parse_str_to_parse_error("url(#bar"),
+            IRI::parse_str("url(#bar"),
             Ok(IRI::Resource(Fragment::new(None, "bar".to_string())))
         );
         assert_eq!(
-            IRI::parse_str_to_parse_error("url(foo#bar"),
+            IRI::parse_str("url(foo#bar"),
             Ok(IRI::Resource(Fragment::new(
                 Some("foo".to_string()),
                 "bar".to_string()
             )))
         );
 
-        assert!(IRI::parse_str_to_parse_error("").is_err());
-        assert!(IRI::parse_str_to_parse_error("foo").is_err());
-        assert!(IRI::parse_str_to_parse_error("url(foo)bar").is_err());
+        assert!(IRI::parse_str("").is_err());
+        assert!(IRI::parse_str("foo").is_err());
+        assert!(IRI::parse_str("url(foo)bar").is_err());
     }
 }
diff --git a/rsvg_internals/src/length.rs b/rsvg_internals/src/length.rs
index 2f1b9102..eef0fb50 100644
--- a/rsvg_internals/src/length.rs
+++ b/rsvg_internals/src/length.rs
@@ -47,7 +47,7 @@ use std::marker::PhantomData;
 
 use crate::drawing_ctx::ViewParams;
 use crate::error::*;
-use crate::parsers::{finite_f32, ParseToParseError};
+use crate::parsers::{finite_f32, Parse};
 use crate::properties::ComputedValues;
 
 /// Units for length values.
@@ -226,10 +226,8 @@ const CM_PER_INCH: f64 = 2.54;
 const MM_PER_INCH: f64 = 25.4;
 const PICA_PER_INCH: f64 = 6.0;
 
-impl<N: Normalize> ParseToParseError for Length<N> {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<Length<N>, CssParseError<'i>> {
+impl<N: Normalize> Parse for Length<N> {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Length<N>, CssParseError<'i>> {
         let length = {
             let token = parser.next()?.clone();
 
@@ -394,12 +392,12 @@ mod tests {
     #[test]
     fn parses_default() {
         assert_eq!(
-            Length::<Horizontal>::parse_str_to_parse_error("42"),
+            Length::<Horizontal>::parse_str("42"),
             Ok(Length::<Horizontal>::new(42.0, LengthUnit::Px))
         );
 
         assert_eq!(
-            Length::<Horizontal>::parse_str_to_parse_error("-42px"),
+            Length::<Horizontal>::parse_str("-42px"),
             Ok(Length::<Horizontal>::new(-42.0, LengthUnit::Px))
         );
     }
@@ -407,7 +405,7 @@ mod tests {
     #[test]
     fn parses_percent() {
         assert_eq!(
-            Length::<Horizontal>::parse_str_to_parse_error("50.0%"),
+            Length::<Horizontal>::parse_str("50.0%"),
             Ok(Length::<Horizontal>::new(0.5, LengthUnit::Percent))
         );
     }
@@ -415,7 +413,7 @@ mod tests {
     #[test]
     fn parses_font_em() {
         assert_eq!(
-            Length::<Vertical>::parse_str_to_parse_error("22.5em"),
+            Length::<Vertical>::parse_str("22.5em"),
             Ok(Length::<Vertical>::new(22.5, LengthUnit::Em))
         );
     }
@@ -423,7 +421,7 @@ mod tests {
     #[test]
     fn parses_font_ex() {
         assert_eq!(
-            Length::<Vertical>::parse_str_to_parse_error("22.5ex"),
+            Length::<Vertical>::parse_str("22.5ex"),
             Ok(Length::<Vertical>::new(22.5, LengthUnit::Ex))
         );
     }
@@ -431,51 +429,51 @@ mod tests {
     #[test]
     fn parses_physical_units() {
         assert_eq!(
-            Length::<Both>::parse_str_to_parse_error("72pt"),
+            Length::<Both>::parse_str("72pt"),
             Ok(Length::<Both>::new(72.0, LengthUnit::Pt))
         );
 
         assert_eq!(
-            Length::<Both>::parse_str_to_parse_error("-22.5in"),
+            Length::<Both>::parse_str("-22.5in"),
             Ok(Length::<Both>::new(-22.5, LengthUnit::In))
         );
 
         assert_eq!(
-            Length::<Both>::parse_str_to_parse_error("-254cm"),
+            Length::<Both>::parse_str("-254cm"),
             Ok(Length::<Both>::new(-254.0, LengthUnit::Cm))
         );
 
         assert_eq!(
-            Length::<Both>::parse_str_to_parse_error("254mm"),
+            Length::<Both>::parse_str("254mm"),
             Ok(Length::<Both>::new(254.0, LengthUnit::Mm))
         );
 
         assert_eq!(
-            Length::<Both>::parse_str_to_parse_error("60pc"),
+            Length::<Both>::parse_str("60pc"),
             Ok(Length::<Both>::new(60.0, LengthUnit::Pc))
         );
     }
 
     #[test]
     fn empty_length_yields_error() {
-        assert!(Length::<Both>::parse_str_to_parse_error("").is_err());
+        assert!(Length::<Both>::parse_str("").is_err());
     }
 
     #[test]
     fn invalid_unit_yields_error() {
-        assert!(Length::<Both>::parse_str_to_parse_error("8furlong").is_err());
+        assert!(Length::<Both>::parse_str("8furlong").is_err());
     }
 
     #[test]
     fn check_nonnegative_works() {
         // and_then with anonymous function
-        assert!(Length::<Both>::parse_str_to_parse_error("0")
+        assert!(Length::<Both>::parse_str("0")
             .unwrap()
             .check_nonnegative()
             .is_ok());
 
         // and_then with named function
-        assert!(Length::<Both>::parse_str_to_parse_error("-10")
+        assert!(Length::<Both>::parse_str("-10")
             .unwrap()
             .check_nonnegative()
             .is_err());
diff --git a/rsvg_internals/src/lib.rs b/rsvg_internals/src/lib.rs
index 806d9382..30178697 100644
--- a/rsvg_internals/src/lib.rs
+++ b/rsvg_internals/src/lib.rs
@@ -47,7 +47,12 @@ pub use crate::dpi::{rsvg_rust_set_default_dpi_x_y, Dpi};
 pub use crate::error::{DefsLookupErrorKind, HrefError, LoadingError, RenderingError};
 
 pub use crate::handle::{
-    Handle, LoadOptions, RsvgDimensionData, RsvgPositionData, RsvgSizeFunc, SizeCallback,
+    Handle,
+    LoadOptions,
+    RsvgDimensionData,
+    RsvgPositionData,
+    RsvgSizeFunc,
+    SizeCallback,
 };
 
 pub use crate::length::{Length, LengthUnit, RsvgLength};
diff --git a/rsvg_internals/src/marker.rs b/rsvg_internals/src/marker.rs
index 3423e50d..fe903137 100644
--- a/rsvg_internals/src/marker.rs
+++ b/rsvg_internals/src/marker.rs
@@ -16,7 +16,7 @@ use crate::float_eq_cairo::ApproxEqCairo;
 use crate::iri::IRI;
 use crate::length::*;
 use crate::node::*;
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::path_builder::*;
 use crate::properties::{ComputedValues, SpecifiedValue, SpecifiedValues};
 use crate::property_bag::PropertyBag;
@@ -36,8 +36,8 @@ impl Default for MarkerUnits {
     }
 }
 
-impl ParseToParseError for MarkerUnits {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<MarkerUnits, CssParseError<'i>> {
+impl Parse for MarkerUnits {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<MarkerUnits, CssParseError<'i>> {
         Ok(parse_identifiers!(
             parser,
             "userSpaceOnUse" => MarkerUnits::UserSpaceOnUse,
@@ -59,17 +59,15 @@ impl Default for MarkerOrient {
     }
 }
 
-impl ParseToParseError for MarkerOrient {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<MarkerOrient, CssParseError<'i>> {
+impl Parse for MarkerOrient {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<MarkerOrient, CssParseError<'i>> {
         if parser
             .try_parse(|p| p.expect_ident_matching("auto"))
             .is_ok()
         {
             Ok(MarkerOrient::Auto)
         } else {
-            Angle::parse_to_parse_error(parser).map(MarkerOrient::Angle)
+            Angle::parse(parser).map(MarkerOrient::Angle)
         }
     }
 }
@@ -92,8 +90,8 @@ impl Default for Marker {
             ref_x: Default::default(),
             ref_y: Default::default(),
             // the following two are per the spec
-            width: Length::<Horizontal>::parse_str_to_parse_error("3").unwrap(),
-            height: Length::<Vertical>::parse_str_to_parse_error("3").unwrap(),
+            width: Length::<Horizontal>::parse_str("3").unwrap(),
+            height: Length::<Vertical>::parse_str("3").unwrap(),
             orient: MarkerOrient::default(),
             aspect: AspectRatio::default(),
             vbox: None,
@@ -183,26 +181,20 @@ impl NodeTrait for Marker {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "markerUnits") => self.units = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "refX") => self.ref_x = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "refY") => self.ref_y = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "markerUnits") => self.units = attr.parse(value)?,
+                expanded_name!(svg "refX") => self.ref_x = attr.parse(value)?,
+                expanded_name!(svg "refY") => self.ref_y = attr.parse(value)?,
                 expanded_name!(svg "markerWidth") => {
-                    self.width = attr.parse_to_parse_error_and_validate(
-                        value,
-                        Length::<Horizontal>::check_nonnegative,
-                    )?
+                    self.width =
+                        attr.parse_and_validate(value, Length::<Horizontal>::check_nonnegative)?
                 }
                 expanded_name!(svg "markerHeight") => {
-                    self.height = attr.parse_to_parse_error_and_validate(
-                        value,
-                        Length::<Vertical>::check_nonnegative,
-                    )?
-                }
-                expanded_name!(svg "orient") => self.orient = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "preserveAspectRatio") => self.aspect = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "viewBox") => {
-                    self.vbox = Some(attr.parse_to_parse_error(value)?)
+                    self.height =
+                        attr.parse_and_validate(value, Length::<Vertical>::check_nonnegative)?
                 }
+                expanded_name!(svg "orient") => self.orient = attr.parse(value)?,
+                expanded_name!(svg "preserveAspectRatio") => self.aspect = attr.parse(value)?,
+                expanded_name!(svg "viewBox") => self.vbox = Some(attr.parse(value)?),
                 _ => (),
             }
         }
@@ -522,7 +514,8 @@ impl Segments {
         for segment in self[..=start_index].iter().rev() {
             match *segment {
                 Segment::Degenerate { .. } => {
-                    return (false, 0.0, 0.0); // reached the beginning of the subpath as we ran into a 
standalone point
+                    return (false, 0.0, 0.0); // reached the beginning of the subpath as we ran into
+                                              // a standalone point
                 }
 
                 Segment::LineOrCurve { .. } => match segment.get_directionalities() {
@@ -545,7 +538,8 @@ impl Segments {
         for segment in &self[start_index..] {
             match *segment {
                 Segment::Degenerate { .. } => {
-                    return (false, 0.0, 0.0); // reached the end of a subpath as we ran into a standalone 
point
+                    return (false, 0.0, 0.0); // reached the end of a subpath as we ran into a
+                                              // standalone point
                 }
 
                 Segment::LineOrCurve { .. } => match segment.get_directionalities() {
@@ -812,51 +806,51 @@ mod parser_tests {
 
     #[test]
     fn parsing_invalid_marker_units_yields_error() {
-        assert!(MarkerUnits::parse_str_to_parse_error("").is_err());
-        assert!(MarkerUnits::parse_str_to_parse_error("foo").is_err());
+        assert!(MarkerUnits::parse_str("").is_err());
+        assert!(MarkerUnits::parse_str("foo").is_err());
     }
 
     #[test]
     fn parses_marker_units() {
         assert_eq!(
-            MarkerUnits::parse_str_to_parse_error("userSpaceOnUse"),
+            MarkerUnits::parse_str("userSpaceOnUse"),
             Ok(MarkerUnits::UserSpaceOnUse)
         );
         assert_eq!(
-            MarkerUnits::parse_str_to_parse_error("strokeWidth"),
+            MarkerUnits::parse_str("strokeWidth"),
             Ok(MarkerUnits::StrokeWidth)
         );
     }
 
     #[test]
     fn parsing_invalid_marker_orient_yields_error() {
-        assert!(MarkerOrient::parse_str_to_parse_error("").is_err());
-        assert!(MarkerOrient::parse_str_to_parse_error("blah").is_err());
-        assert!(MarkerOrient::parse_str_to_parse_error("45blah").is_err());
+        assert!(MarkerOrient::parse_str("").is_err());
+        assert!(MarkerOrient::parse_str("blah").is_err());
+        assert!(MarkerOrient::parse_str("45blah").is_err());
     }
 
     #[test]
     fn parses_marker_orient() {
-        assert_eq!(MarkerOrient::parse_str_to_parse_error("auto"), Ok(MarkerOrient::Auto));
+        assert_eq!(MarkerOrient::parse_str("auto"), Ok(MarkerOrient::Auto));
 
         assert_eq!(
-            MarkerOrient::parse_str_to_parse_error("0"),
+            MarkerOrient::parse_str("0"),
             Ok(MarkerOrient::Angle(Angle::new(0.0)))
         );
         assert_eq!(
-            MarkerOrient::parse_str_to_parse_error("180"),
+            MarkerOrient::parse_str("180"),
             Ok(MarkerOrient::Angle(Angle::from_degrees(180.0)))
         );
         assert_eq!(
-            MarkerOrient::parse_str_to_parse_error("180deg"),
+            MarkerOrient::parse_str("180deg"),
             Ok(MarkerOrient::Angle(Angle::from_degrees(180.0)))
         );
         assert_eq!(
-            MarkerOrient::parse_str_to_parse_error("-400grad"),
+            MarkerOrient::parse_str("-400grad"),
             Ok(MarkerOrient::Angle(Angle::from_degrees(-360.0)))
         );
         assert_eq!(
-            MarkerOrient::parse_str_to_parse_error("1rad"),
+            MarkerOrient::parse_str("1rad"),
             Ok(MarkerOrient::Angle(Angle::new(1.0)))
         );
     }
diff --git a/rsvg_internals/src/mask.rs b/rsvg_internals/src/mask.rs
index 75a82167..746b83ff 100644
--- a/rsvg_internals/src/mask.rs
+++ b/rsvg_internals/src/mask.rs
@@ -9,7 +9,7 @@ use crate::drawing_ctx::{CompositingAffines, DrawingCtx};
 use crate::error::RenderingError;
 use crate::length::*;
 use crate::node::{CascadedValues, NodeDraw, NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::property_defs::Opacity;
 use crate::rect::Rect;
@@ -32,10 +32,10 @@ impl Default for Mask {
     fn default() -> Mask {
         Mask {
             // these values are per the spec
-            x: Length::<Horizontal>::parse_str_to_parse_error("-10%").unwrap(),
-            y: Length::<Vertical>::parse_str_to_parse_error("-10%").unwrap(),
-            width: Length::<Horizontal>::parse_str_to_parse_error("120%").unwrap(),
-            height: Length::<Vertical>::parse_str_to_parse_error("120%").unwrap(),
+            x: Length::<Horizontal>::parse_str("-10%").unwrap(),
+            y: Length::<Vertical>::parse_str("-10%").unwrap(),
+            width: Length::<Horizontal>::parse_str("120%").unwrap(),
+            height: Length::<Vertical>::parse_str("120%").unwrap(),
 
             units: MaskUnits::default(),
             content_units: MaskContentUnits::default(),
@@ -136,18 +136,18 @@ impl NodeTrait for Mask {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "x") => self.x = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "y") => self.y = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "x") => self.x = attr.parse(value)?,
+                expanded_name!(svg "y") => self.y = attr.parse(value)?,
                 expanded_name!(svg "width") => {
                     self.width =
-                        attr.parse_to_parse_error_and_validate(value, 
Length::<Horizontal>::check_nonnegative)?
+                        attr.parse_and_validate(value, Length::<Horizontal>::check_nonnegative)?
                 }
                 expanded_name!(svg "height") => {
                     self.height =
-                        attr.parse_to_parse_error_and_validate(value, Length::<Vertical>::check_nonnegative)?
+                        attr.parse_and_validate(value, Length::<Vertical>::check_nonnegative)?
                 }
-                expanded_name!(svg "maskUnits") => self.units = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "maskContentUnits") => self.content_units = 
attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "maskUnits") => self.units = attr.parse(value)?,
+                expanded_name!(svg "maskContentUnits") => self.content_units = attr.parse(value)?,
                 _ => (),
             }
         }
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index feb5d5a5..b3dd0130 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::ParseToParseError;
+use crate::parsers::Parse;
 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_to_parse_error(value).attribute(attr).and_then(|affine| {
+                    return Matrix::parse_str(value).attribute(attr).and_then(|affine| {
                         self.transform = affine;
                         Ok(())
                     });
diff --git a/rsvg_internals/src/number_list.rs b/rsvg_internals/src/number_list.rs
index efb6e661..e0768ea5 100644
--- a/rsvg_internals/src/number_list.rs
+++ b/rsvg_internals/src/number_list.rs
@@ -3,7 +3,7 @@
 use cssparser::{Parser, ParserInput};
 
 use crate::error::*;
-use crate::parsers::{optional_comma, ParseToParseError};
+use crate::parsers::{optional_comma, Parse};
 
 #[derive(Eq, PartialEq)]
 pub enum NumberListLength {
@@ -15,7 +15,7 @@ pub enum NumberListLength {
 pub struct NumberList(pub Vec<f64>);
 
 impl NumberList {
-    pub fn parse_to_parse_error<'i>(
+    pub fn parse<'i>(
         parser: &mut Parser<'i, '_>,
         length: NumberListLength,
     ) -> Result<Self, CssParseError<'i>> {
@@ -34,7 +34,7 @@ impl NumberList {
                 optional_comma(parser);
             }
 
-            v.push(f64::parse_to_parse_error(parser)?);
+            v.push(f64::parse(parser)?);
 
             if let NumberListLength::Exact(l) = length {
                 if i + 1 == l {
@@ -59,11 +59,14 @@ impl NumberList {
         Ok(NumberList(v))
     }
 
-    pub fn parse_str_to_parse_error<'i>(s: &'i str, length: NumberListLength) -> Result<NumberList, 
CssParseError<'i>> {
+    pub fn parse_str<'i>(
+        s: &'i str,
+        length: NumberListLength,
+    ) -> Result<NumberList, CssParseError<'i>> {
         let mut input = ParserInput::new(s);
         let mut parser = Parser::new(&mut input);
 
-        Self::parse_to_parse_error(&mut parser, length).and_then(|r| {
+        Self::parse(&mut parser, length).and_then(|r| {
             // FIXME: parser.expect_exhausted()?;
             Ok(r)
         })
@@ -77,22 +80,22 @@ mod tests {
     #[test]
     fn parses_number_list() {
         assert_eq!(
-            NumberList::parse_str_to_parse_error("5", NumberListLength::Exact(1)),
+            NumberList::parse_str("5", NumberListLength::Exact(1)),
             Ok(NumberList(vec![5.0]))
         );
 
         assert_eq!(
-            NumberList::parse_str_to_parse_error("1 2 3 4", NumberListLength::Exact(4)),
+            NumberList::parse_str("1 2 3 4", NumberListLength::Exact(4)),
             Ok(NumberList(vec![1.0, 2.0, 3.0, 4.0]))
         );
 
         assert_eq!(
-            NumberList::parse_str_to_parse_error("", NumberListLength::Unbounded),
+            NumberList::parse_str("", NumberListLength::Unbounded),
             Ok(NumberList(vec![]))
         );
 
         assert_eq!(
-            NumberList::parse_str_to_parse_error("1, 2, 3.0, 4, 5", NumberListLength::Unbounded),
+            NumberList::parse_str("1, 2, 3.0, 4, 5", NumberListLength::Unbounded),
             Ok(NumberList(vec![1.0, 2.0, 3.0, 4.0, 5.0]))
         );
     }
@@ -100,25 +103,25 @@ mod tests {
     #[test]
     fn errors_on_invalid_number_list() {
         // empty
-        assert!(NumberList::parse_str_to_parse_error("", NumberListLength::Exact(1)).is_err());
+        assert!(NumberList::parse_str("", NumberListLength::Exact(1)).is_err());
 
         // garbage
-        assert!(NumberList::parse_str_to_parse_error("foo", NumberListLength::Exact(1)).is_err());
-        assert!(NumberList::parse_str_to_parse_error("1foo", NumberListLength::Exact(2)).is_err());
-        assert!(NumberList::parse_str_to_parse_error("1 foo", NumberListLength::Exact(2)).is_err());
-        assert!(NumberList::parse_str_to_parse_error("1 foo 2", NumberListLength::Exact(2)).is_err());
-        assert!(NumberList::parse_str_to_parse_error("1,foo", NumberListLength::Exact(2)).is_err());
+        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_to_parse_error("1 2", NumberListLength::Exact(1)).is_err());
+        assert!(NumberList::parse_str("1 2", NumberListLength::Exact(1)).is_err());
 
         // extra token
-        assert!(NumberList::parse_str_to_parse_error("1,", NumberListLength::Exact(1)).is_err());
-        assert!(NumberList::parse_str_to_parse_error("1,", NumberListLength::Exact(1)).is_err());
-        assert!(NumberList::parse_str_to_parse_error("1,", NumberListLength::Unbounded).is_err());
+        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_to_parse_error("1", NumberListLength::Exact(2)).is_err());
-        assert!(NumberList::parse_str_to_parse_error("1 2", NumberListLength::Exact(3)).is_err());
+        assert!(NumberList::parse_str("1", NumberListLength::Exact(2)).is_err());
+        assert!(NumberList::parse_str("1 2", NumberListLength::Exact(3)).is_err());
     }
 }
diff --git a/rsvg_internals/src/paint_server.rs b/rsvg_internals/src/paint_server.rs
index 20739b83..254b1a77 100644
--- a/rsvg_internals/src/paint_server.rs
+++ b/rsvg_internals/src/paint_server.rs
@@ -7,7 +7,7 @@ use crate::bbox::BoundingBox;
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::node::{CascadedValues, RsvgNode};
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 use crate::properties::ComputedValues;
 use crate::unit_interval::UnitInterval;
 
@@ -21,10 +21,8 @@ pub enum PaintServer {
     SolidColor(cssparser::Color),
 }
 
-impl ParseToParseError for PaintServer {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<PaintServer, CssParseError<'i>> {
+impl Parse for PaintServer {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<PaintServer, CssParseError<'i>> {
         if parser
             .try_parse(|i| i.expect_ident_matching("none"))
             .is_ok()
@@ -128,27 +126,27 @@ mod tests {
 
     #[test]
     fn catches_invalid_syntax() {
-        assert!(PaintServer::parse_str_to_parse_error("").is_err());
-        assert!(PaintServer::parse_str_to_parse_error("42").is_err());
-        assert!(PaintServer::parse_str_to_parse_error("invalid").is_err());
+        assert!(PaintServer::parse_str("").is_err());
+        assert!(PaintServer::parse_str("42").is_err());
+        assert!(PaintServer::parse_str("invalid").is_err());
     }
 
     #[test]
     fn parses_none() {
-        assert_eq!(PaintServer::parse_str_to_parse_error("none"), Ok(PaintServer::None));
+        assert_eq!(PaintServer::parse_str("none"), Ok(PaintServer::None));
     }
 
     #[test]
     fn parses_solid_color() {
         assert_eq!(
-            PaintServer::parse_str_to_parse_error("rgb(255, 128, 64, 0.5)"),
+            PaintServer::parse_str("rgb(255, 128, 64, 0.5)"),
             Ok(PaintServer::SolidColor(cssparser::Color::RGBA(
                 cssparser::RGBA::new(255, 128, 64, 128)
             )))
         );
 
         assert_eq!(
-            PaintServer::parse_str_to_parse_error("currentColor"),
+            PaintServer::parse_str("currentColor"),
             Ok(PaintServer::SolidColor(cssparser::Color::CurrentColor))
         );
     }
@@ -156,7 +154,7 @@ mod tests {
     #[test]
     fn parses_iri() {
         assert_eq!(
-            PaintServer::parse_str_to_parse_error("url(#link)"),
+            PaintServer::parse_str("url(#link)"),
             Ok(PaintServer::Iri {
                 iri: Fragment::new(None, "link".to_string()),
                 alternate: None,
@@ -164,7 +162,7 @@ mod tests {
         );
 
         assert_eq!(
-            PaintServer::parse_str_to_parse_error("url(foo#link) none"),
+            PaintServer::parse_str("url(foo#link) none"),
             Ok(PaintServer::Iri {
                 iri: Fragment::new(Some("foo".to_string()), "link".to_string()),
                 alternate: None,
@@ -172,7 +170,7 @@ mod tests {
         );
 
         assert_eq!(
-            PaintServer::parse_str_to_parse_error("url(#link) #ff8040"),
+            PaintServer::parse_str("url(#link) #ff8040"),
             Ok(PaintServer::Iri {
                 iri: Fragment::new(None, "link".to_string()),
                 alternate: Some(cssparser::Color::RGBA(cssparser::RGBA::new(
@@ -182,7 +180,7 @@ mod tests {
         );
 
         assert_eq!(
-            PaintServer::parse_str_to_parse_error("url(#link) rgb(255, 128, 64, 0.5)"),
+            PaintServer::parse_str("url(#link) rgb(255, 128, 64, 0.5)"),
             Ok(PaintServer::Iri {
                 iri: Fragment::new(None, "link".to_string()),
                 alternate: Some(cssparser::Color::RGBA(cssparser::RGBA::new(
@@ -192,13 +190,13 @@ mod tests {
         );
 
         assert_eq!(
-            PaintServer::parse_str_to_parse_error("url(#link) currentColor"),
+            PaintServer::parse_str("url(#link) currentColor"),
             Ok(PaintServer::Iri {
                 iri: Fragment::new(None, "link".to_string()),
                 alternate: Some(cssparser::Color::CurrentColor),
             },)
         );
 
-        assert!(PaintServer::parse_str_to_parse_error("url(#link) invalid").is_err());
+        assert!(PaintServer::parse_str("url(#link) invalid").is_err());
     }
 }
diff --git a/rsvg_internals/src/parsers.rs b/rsvg_internals/src/parsers.rs
index b8891145..be6d5863 100644
--- a/rsvg_internals/src/parsers.rs
+++ b/rsvg_internals/src/parsers.rs
@@ -8,21 +8,21 @@ use std::str;
 use crate::error::*;
 
 /// Trait to parse values using `cssparser::Parser`.
-pub trait ParseToParseError: Sized {
+pub trait Parse: Sized {
     /// Parses a value out of the `parser`.
     ///
     /// All value types should implement this for composability.
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>>;
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>>;
 
     /// Convenience function to parse a value out of a `&str`.
     ///
     /// This is useful mostly for tests which want to avoid creating a
     /// `cssparser::Parser` by hand.
-    fn parse_str_to_parse_error<'i>(s: &'i str) -> Result<Self, CssParseError<'i>> {
+    fn parse_str<'i>(s: &'i str) -> Result<Self, CssParseError<'i>> {
         let mut input = ParserInput::new(s);
         let mut parser = Parser::new(&mut input);
 
-        Self::parse_to_parse_error(&mut parser).and_then(|r| {
+        Self::parse(&mut parser).and_then(|r| {
             // FIXME: parser.expect_exhausted()?;
             Ok(r)
         })
@@ -42,27 +42,27 @@ pub fn finite_f32(n: f32) -> Result<f32, ValueErrorKind> {
     }
 }
 
-pub trait ParseValueToParseError<T: ParseToParseError> {
+pub trait ParseValue<T: Parse> {
     /// Parses a `value` string into a type `T`.
-    fn parse_to_parse_error(&self, value: &str) -> Result<T, NodeError>;
+    fn parse(&self, value: &str) -> Result<T, NodeError>;
 
     /// Parses a `value` string into a type `T` with an optional validation function.
-    fn parse_to_parse_error_and_validate<F: FnOnce(T) -> Result<T, ValueErrorKind>>(
+    fn parse_and_validate<F: FnOnce(T) -> Result<T, ValueErrorKind>>(
         &self,
         value: &str,
         validate: F,
     ) -> Result<T, NodeError>;
 }
 
-impl<T: ParseToParseError> ParseValueToParseError<T> for QualName {
-    fn parse_to_parse_error(&self, value: &str) -> Result<T, NodeError> {
+impl<T: Parse> ParseValue<T> for QualName {
+    fn parse(&self, value: &str) -> Result<T, NodeError> {
         let mut input = ParserInput::new(value);
         let mut parser = Parser::new(&mut input);
 
-        T::parse_to_parse_error(&mut parser).attribute(self.clone())
+        T::parse(&mut parser).attribute(self.clone())
     }
 
-    fn parse_to_parse_error_and_validate<F: FnOnce(T) -> Result<T, ValueErrorKind>>(
+    fn parse_and_validate<F: FnOnce(T) -> Result<T, ValueErrorKind>>(
         &self,
         value: &str,
         validate: F,
@@ -70,25 +70,24 @@ impl<T: ParseToParseError> ParseValueToParseError<T> for QualName {
         let mut input = ParserInput::new(value);
         let mut parser = Parser::new(&mut input);
 
-        let v = T::parse_to_parse_error(&mut parser).attribute(self.clone())?;
+        let v = T::parse(&mut parser).attribute(self.clone())?;
 
-        validate(v).map_err(|e| parser.new_custom_error(e)).attribute(self.clone())
+        validate(v)
+            .map_err(|e| parser.new_custom_error(e))
+            .attribute(self.clone())
     }
 }
 
-impl ParseToParseError for f64 {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+impl Parse for f64 {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         let loc = parser.current_source_location();
-        parser
-            .expect_number()
-            .map_err(|e| e.into())
-            .and_then(|n| {
-                if n.is_finite() {
-                    Ok(f64::from(n))
-                } else {
-                    Err(loc.new_custom_error(ValueErrorKind::value_error("expected finite number")))
-                }
-            })
+        parser.expect_number().map_err(|e| e.into()).and_then(|n| {
+            if n.is_finite() {
+                Ok(f64::from(n))
+            } else {
+                Err(loc.new_custom_error(ValueErrorKind::value_error("expected finite number")))
+            }
+        })
     }
 }
 
@@ -96,15 +95,15 @@ impl ParseToParseError for f64 {
 ///
 /// https://www.w3.org/TR/SVG/types.html#DataTypeNumberOptionalNumber
 #[derive(Debug, Copy, Clone, PartialEq)]
-pub struct NumberOptionalNumber<T: ParseToParseError>(pub T, pub T);
+pub struct NumberOptionalNumber<T: Parse>(pub T, pub T);
 
-impl<T: ParseToParseError + Copy> ParseToParseError for NumberOptionalNumber<T> {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
-        let x = ParseToParseError::parse_to_parse_error(parser)?;
+impl<T: Parse + Copy> Parse for NumberOptionalNumber<T> {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+        let x = Parse::parse(parser)?;
 
         if !parser.is_exhausted() {
             optional_comma(parser);
-            let y = ParseToParseError::parse_to_parse_error(parser)?;
+            let y = Parse::parse(parser)?;
             parser.expect_exhausted()?;
             Ok(NumberOptionalNumber(x, y))
         } else {
@@ -113,11 +112,11 @@ impl<T: ParseToParseError + Copy> ParseToParseError for NumberOptionalNumber<T>
     }
 }
 
-impl ParseToParseError for i32 {
+impl Parse for i32 {
     /// CSS integer
     ///
     /// https://www.w3.org/TR/SVG11/types.html#DataTypeInteger
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, CssParseError<'i>> {
         Ok(parser.expect_integer()?)
     }
 }
@@ -156,96 +155,96 @@ mod tests {
     #[test]
     fn parses_number_optional_number() {
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("1, 2"),
+            NumberOptionalNumber::parse_str("1, 2"),
             Ok(NumberOptionalNumber(1.0, 2.0))
         );
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("1 2"),
+            NumberOptionalNumber::parse_str("1 2"),
             Ok(NumberOptionalNumber(1.0, 2.0))
         );
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("1"),
+            NumberOptionalNumber::parse_str("1"),
             Ok(NumberOptionalNumber(1.0, 1.0))
         );
 
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("-1, -2"),
+            NumberOptionalNumber::parse_str("-1, -2"),
             Ok(NumberOptionalNumber(-1.0, -2.0))
         );
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("-1 -2"),
+            NumberOptionalNumber::parse_str("-1 -2"),
             Ok(NumberOptionalNumber(-1.0, -2.0))
         );
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("-1"),
+            NumberOptionalNumber::parse_str("-1"),
             Ok(NumberOptionalNumber(-1.0, -1.0))
         );
     }
 
     #[test]
     fn invalid_number_optional_number() {
-        assert!(NumberOptionalNumber::<f64>::parse_str_to_parse_error("").is_err());
-        assert!(NumberOptionalNumber::<f64>::parse_str_to_parse_error("1x").is_err());
-        assert!(NumberOptionalNumber::<f64>::parse_str_to_parse_error("x1").is_err());
-        assert!(NumberOptionalNumber::<f64>::parse_str_to_parse_error("1 x").is_err());
-        assert!(NumberOptionalNumber::<f64>::parse_str_to_parse_error("1 , x").is_err());
-        assert!(NumberOptionalNumber::<f64>::parse_str_to_parse_error("1 , 2x").is_err());
-        assert!(NumberOptionalNumber::<f64>::parse_str_to_parse_error("1 2 x").is_err());
+        assert!(NumberOptionalNumber::<f64>::parse_str("").is_err());
+        assert!(NumberOptionalNumber::<f64>::parse_str("1x").is_err());
+        assert!(NumberOptionalNumber::<f64>::parse_str("x1").is_err());
+        assert!(NumberOptionalNumber::<f64>::parse_str("1 x").is_err());
+        assert!(NumberOptionalNumber::<f64>::parse_str("1 , x").is_err());
+        assert!(NumberOptionalNumber::<f64>::parse_str("1 , 2x").is_err());
+        assert!(NumberOptionalNumber::<f64>::parse_str("1 2 x").is_err());
     }
 
     #[test]
     fn parses_integer() {
-        assert_eq!(i32::parse_str_to_parse_error("1"), Ok(1));
-        assert_eq!(i32::parse_str_to_parse_error("-1"), Ok(-1));
+        assert_eq!(i32::parse_str("1"), Ok(1));
+        assert_eq!(i32::parse_str("-1"), Ok(-1));
     }
 
     #[test]
     fn invalid_integer() {
-        assert!(i32::parse_str_to_parse_error("").is_err());
-        assert!(i32::parse_str_to_parse_error("1x").is_err());
-        assert!(i32::parse_str_to_parse_error("1.5").is_err());
+        assert!(i32::parse_str("").is_err());
+        assert!(i32::parse_str("1x").is_err());
+        assert!(i32::parse_str("1.5").is_err());
     }
 
     #[test]
     fn parses_integer_optional_integer() {
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("1, 2"),
+            NumberOptionalNumber::parse_str("1, 2"),
             Ok(NumberOptionalNumber(1, 2))
         );
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("1 2"),
+            NumberOptionalNumber::parse_str("1 2"),
             Ok(NumberOptionalNumber(1, 2))
         );
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("1"),
+            NumberOptionalNumber::parse_str("1"),
             Ok(NumberOptionalNumber(1, 1))
         );
 
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("-1, -2"),
+            NumberOptionalNumber::parse_str("-1, -2"),
             Ok(NumberOptionalNumber(-1, -2))
         );
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("-1 -2"),
+            NumberOptionalNumber::parse_str("-1 -2"),
             Ok(NumberOptionalNumber(-1, -2))
         );
         assert_eq!(
-            NumberOptionalNumber::parse_str_to_parse_error("-1"),
+            NumberOptionalNumber::parse_str("-1"),
             Ok(NumberOptionalNumber(-1, -1))
         );
     }
 
     #[test]
     fn invalid_integer_optional_integer() {
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("").is_err());
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("1x").is_err());
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("x1").is_err());
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("1 x").is_err());
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("1 , x").is_err());
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("1 , 2x").is_err());
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("1 2 x").is_err());
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("1.5").is_err());
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("1 2.5").is_err());
-        assert!(NumberOptionalNumber::<i32>::parse_str_to_parse_error("1, 2.5").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("1x").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("x1").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("1 x").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("1 , x").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("1 , 2x").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("1 2 x").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("1.5").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("1 2.5").is_err());
+        assert!(NumberOptionalNumber::<i32>::parse_str("1, 2.5").is_err());
     }
 }
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index 488023ce..d189760b 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -15,7 +15,7 @@ use crate::float_eq_cairo::ApproxEqCairo;
 use crate::length::*;
 use crate::node::*;
 use crate::paint_server::{AsPaintSource, PaintSource};
-use crate::parsers::ParseValueToParseError;
+use crate::parsers::ParseValue;
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
 use crate::rect::Rect;
@@ -120,30 +120,30 @@ impl NodeTrait for Pattern {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "patternUnits") => self.common.units = 
Some(attr.parse_to_parse_error(value)?),
+                expanded_name!(svg "patternUnits") => self.common.units = Some(attr.parse(value)?),
                 expanded_name!(svg "patternContentUnits") => {
-                    self.common.content_units = Some(attr.parse_to_parse_error(value)?)
+                    self.common.content_units = Some(attr.parse(value)?)
                 }
-                expanded_name!(svg "viewBox") => self.common.vbox = 
Some(Some(attr.parse_to_parse_error(value)?)),
+                expanded_name!(svg "viewBox") => self.common.vbox = Some(Some(attr.parse(value)?)),
                 expanded_name!(svg "preserveAspectRatio") => {
-                    self.common.preserve_aspect_ratio = Some(attr.parse_to_parse_error(value)?)
+                    self.common.preserve_aspect_ratio = Some(attr.parse(value)?)
                 }
                 expanded_name!(svg "patternTransform") => {
-                    self.common.affine = Some(attr.parse_to_parse_error(value)?)
+                    self.common.affine = Some(attr.parse(value)?)
                 }
                 expanded_name!(xlink "href") => {
                     self.fallback = Some(Fragment::parse(value).attribute(attr)?);
                 }
-                expanded_name!(svg "x") => self.common.x = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "y") => self.common.y = Some(attr.parse_to_parse_error(value)?),
+                expanded_name!(svg "x") => self.common.x = Some(attr.parse(value)?),
+                expanded_name!(svg "y") => self.common.y = Some(attr.parse(value)?),
                 expanded_name!(svg "width") => {
                     self.common.width = Some(
-                        attr.parse_to_parse_error_and_validate(value, 
Length::<Horizontal>::check_nonnegative)?,
+                        attr.parse_and_validate(value, Length::<Horizontal>::check_nonnegative)?,
                     )
                 }
                 expanded_name!(svg "height") => {
                     self.common.height =
-                        Some(attr.parse_to_parse_error_and_validate(value, 
Length::<Vertical>::check_nonnegative)?)
+                        Some(attr.parse_and_validate(value, Length::<Vertical>::check_nonnegative)?)
                 }
                 _ => (),
             }
@@ -314,10 +314,8 @@ impl AsPaintSource for ResolvedPattern {
         // Create the pattern contents coordinate system
         let _params = if let Some(vbox) = vbox {
             // If there is a vbox, use that
-            let r = preserve_aspect_ratio.compute(
-                &vbox,
-                &Rect::from_size(scaled_width, scaled_height),
-            );
+            let r =
+                preserve_aspect_ratio.compute(&vbox, &Rect::from_size(scaled_width, scaled_height));
 
             let sw = r.width() / vbox.0.width();
             let sh = r.height() / vbox.0.height();
diff --git a/rsvg_internals/src/properties.rs b/rsvg_internals/src/properties.rs
index 63b293f1..a14a794c 100644
--- a/rsvg_internals/src/properties.rs
+++ b/rsvg_internals/src/properties.rs
@@ -1,14 +1,20 @@
 //! CSS properties, specified values, computed values.
 
 use cssparser::{
-    self, BasicParseErrorKind, DeclarationListParser, ParseErrorKind, Parser, ParserInput, ToCss,
+    self,
+    BasicParseErrorKind,
+    DeclarationListParser,
+    ParseErrorKind,
+    Parser,
+    ParserInput,
+    ToCss,
 };
 use markup5ever::{expanded_name, local_name, namespace_url, ns, QualName};
 use std::collections::HashSet;
 
 use crate::css::{DeclParser, Declaration};
 use crate::error::*;
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::property_defs::*;
 use crate::property_macros::Property;
@@ -231,147 +237,147 @@ pub fn parse_property<'i>(prop_name: &QualName, input: &mut Parser<'i, '_>, acce
     // please keep these sorted
     match prop_name.expanded() {
         expanded_name!(svg "baseline-shift") =>
-            Ok(ParsedProperty::BaselineShift(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::BaselineShift(parse_input(input)?)),
 
         expanded_name!(svg "clip-path") =>
-            Ok(ParsedProperty::ClipPath(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::ClipPath(parse_input(input)?)),
 
         expanded_name!(svg "clip-rule") =>
-            Ok(ParsedProperty::ClipRule(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::ClipRule(parse_input(input)?)),
 
         expanded_name!(svg "color") =>
-            Ok(ParsedProperty::Color(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Color(parse_input(input)?)),
 
         expanded_name!(svg "color-interpolation-filters") =>
-            Ok(ParsedProperty::ColorInterpolationFilters(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::ColorInterpolationFilters(parse_input(input)?)),
 
         expanded_name!(svg "direction") =>
-            Ok(ParsedProperty::Direction(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Direction(parse_input(input)?)),
 
         expanded_name!(svg "display") =>
-            Ok(ParsedProperty::Display(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Display(parse_input(input)?)),
 
         expanded_name!(svg "enable-background") =>
-            Ok(ParsedProperty::EnableBackground(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::EnableBackground(parse_input(input)?)),
 
         expanded_name!(svg "fill") =>
-            Ok(ParsedProperty::Fill(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Fill(parse_input(input)?)),
 
         expanded_name!(svg "fill-opacity") =>
-            Ok(ParsedProperty::FillOpacity(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FillOpacity(parse_input(input)?)),
 
         expanded_name!(svg "fill-rule") =>
-            Ok(ParsedProperty::FillRule(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FillRule(parse_input(input)?)),
 
         expanded_name!(svg "filter") =>
-            Ok(ParsedProperty::Filter(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Filter(parse_input(input)?)),
 
         expanded_name!(svg "flood-color") =>
-            Ok(ParsedProperty::FloodColor(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FloodColor(parse_input(input)?)),
 
         expanded_name!(svg "flood-opacity") =>
-            Ok(ParsedProperty::FloodOpacity(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FloodOpacity(parse_input(input)?)),
 
         expanded_name!(svg "font-family") =>
-            Ok(ParsedProperty::FontFamily(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FontFamily(parse_input(input)?)),
 
         expanded_name!(svg "font-size") =>
-            Ok(ParsedProperty::FontSize(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FontSize(parse_input(input)?)),
 
         expanded_name!(svg "font-stretch") =>
-            Ok(ParsedProperty::FontStretch(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FontStretch(parse_input(input)?)),
 
         expanded_name!(svg "font-style") =>
-            Ok(ParsedProperty::FontStyle(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FontStyle(parse_input(input)?)),
 
         expanded_name!(svg "font-variant") =>
-            Ok(ParsedProperty::FontVariant(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FontVariant(parse_input(input)?)),
 
         expanded_name!(svg "font-weight") =>
-            Ok(ParsedProperty::FontWeight(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::FontWeight(parse_input(input)?)),
 
         expanded_name!(svg "letter-spacing") =>
-            Ok(ParsedProperty::LetterSpacing(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::LetterSpacing(parse_input(input)?)),
 
         expanded_name!(svg "lighting-color") =>
-            Ok(ParsedProperty::LightingColor(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::LightingColor(parse_input(input)?)),
 
         expanded_name!(svg "marker") => {
             if accept_shorthands {
-                Ok(ParsedProperty::Marker(parse_input_to_parse_error(input)?))
+                Ok(ParsedProperty::Marker(parse_input(input)?))
             } else {
                 Err(ValueErrorKind::UnknownProperty)?
             }
         }
 
         expanded_name!(svg "marker-end") =>
-            Ok(ParsedProperty::MarkerEnd(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::MarkerEnd(parse_input(input)?)),
 
         expanded_name!(svg "marker-mid") =>
-            Ok(ParsedProperty::MarkerMid(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::MarkerMid(parse_input(input)?)),
 
         expanded_name!(svg "marker-start") =>
-            Ok(ParsedProperty::MarkerStart(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::MarkerStart(parse_input(input)?)),
 
         expanded_name!(svg "mask") =>
-            Ok(ParsedProperty::Mask(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Mask(parse_input(input)?)),
 
         expanded_name!(svg "opacity") =>
-            Ok(ParsedProperty::Opacity(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Opacity(parse_input(input)?)),
 
         expanded_name!(svg "overflow") =>
-            Ok(ParsedProperty::Overflow(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Overflow(parse_input(input)?)),
 
         expanded_name!(svg "shape-rendering") =>
-            Ok(ParsedProperty::ShapeRendering(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::ShapeRendering(parse_input(input)?)),
 
         expanded_name!(svg "stop-color") =>
-            Ok(ParsedProperty::StopColor(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::StopColor(parse_input(input)?)),
 
         expanded_name!(svg "stop-opacity") =>
-            Ok(ParsedProperty::StopOpacity(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::StopOpacity(parse_input(input)?)),
 
         expanded_name!(svg "stroke") =>
-            Ok(ParsedProperty::Stroke(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Stroke(parse_input(input)?)),
 
         expanded_name!(svg "stroke-dasharray") =>
-            Ok(ParsedProperty::StrokeDasharray(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::StrokeDasharray(parse_input(input)?)),
 
         expanded_name!(svg "stroke-dashoffset") =>
-            Ok(ParsedProperty::StrokeDashoffset(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::StrokeDashoffset(parse_input(input)?)),
 
         expanded_name!(svg "stroke-linecap") =>
-            Ok(ParsedProperty::StrokeLinecap(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::StrokeLinecap(parse_input(input)?)),
 
         expanded_name!(svg "stroke-linejoin") =>
-            Ok(ParsedProperty::StrokeLinejoin(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::StrokeLinejoin(parse_input(input)?)),
 
         expanded_name!(svg "stroke-miterlimit") =>
-            Ok(ParsedProperty::StrokeMiterlimit(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::StrokeMiterlimit(parse_input(input)?)),
 
         expanded_name!(svg "stroke-opacity") =>
-            Ok(ParsedProperty::StrokeOpacity(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::StrokeOpacity(parse_input(input)?)),
 
         expanded_name!(svg "stroke-width") =>
-            Ok(ParsedProperty::StrokeWidth(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::StrokeWidth(parse_input(input)?)),
 
         expanded_name!(svg "text-anchor") =>
-            Ok(ParsedProperty::TextAnchor(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::TextAnchor(parse_input(input)?)),
 
         expanded_name!(svg "text-decoration") =>
-            Ok(ParsedProperty::TextDecoration(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::TextDecoration(parse_input(input)?)),
 
         expanded_name!(svg "text-rendering") =>
-            Ok(ParsedProperty::TextRendering(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::TextRendering(parse_input(input)?)),
 
         expanded_name!(svg "unicode-bidi") =>
-            Ok(ParsedProperty::UnicodeBidi(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::UnicodeBidi(parse_input(input)?)),
 
         expanded_name!(svg "visibility") =>
-            Ok(ParsedProperty::Visibility(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::Visibility(parse_input(input)?)),
 
         expanded_name!(svg "writing-mode") =>
-            Ok(ParsedProperty::WritingMode(parse_input_to_parse_error(input)?)),
+            Ok(ParsedProperty::WritingMode(parse_input(input)?)),
 
         _ => Err(ValueErrorKind::UnknownProperty)?
     }
@@ -544,9 +550,7 @@ impl SpecifiedValues {
             // be in error in that case.
             Err(ParseError::V(v)) => {
                 rsvg_log!(
-                    "(ignoring invalid presentation attribute {:?}\n    \
-                     value=\"{}\"\n    \
-                     {})",
+                    "(ignoring invalid presentation attribute {:?}\n    value=\"{}\"\n    {})",
                     attr.expanded(),
                     value,
                     v
@@ -561,8 +565,7 @@ impl SpecifiedValues {
 
                 t.to_css(&mut tok).unwrap(); // FIXME: what do we do with a fmt::Error?
                 rsvg_log!(
-                    "(ignoring invalid presentation attribute {:?}\n    \
-                     value=\"{}\"\n    \
+                    "(ignoring invalid presentation attribute {:?}\n    value=\"{}\"\n    \
                      unexpected token '{}')",
                     attr.expanded(),
                     value,
@@ -575,8 +578,7 @@ impl SpecifiedValues {
                 ..
             })) => {
                 rsvg_log!(
-                    "(ignoring invalid presentation attribute {:?}\n    \
-                     value=\"{}\"\n    \
+                    "(ignoring invalid presentation attribute {:?}\n    value=\"{}\"\n    \
                      unexpected end of input)",
                     attr.expanded(),
                     value,
@@ -588,8 +590,7 @@ impl SpecifiedValues {
                 ..
             })) => {
                 rsvg_log!(
-                    "(ignoring invalid presentation attribute {:?}\n    \
-                     value=\"{}\"\n    \
+                    "(ignoring invalid presentation attribute {:?}\n    value=\"{}\"\n    \
                      unexpected error)",
                     attr.expanded(),
                     value,
@@ -601,9 +602,7 @@ impl SpecifiedValues {
                 ..
             })) => {
                 rsvg_log!(
-                    "(ignoring invalid presentation attribute {:?}\n    \
-                     value=\"{}\"\n    \
-                     {})",
+                    "(ignoring invalid presentation attribute {:?}\n    value=\"{}\"\n    {})",
                     attr.expanded(),
                     value,
                     v
@@ -624,14 +623,14 @@ impl SpecifiedValues {
                     // xml:lang is a non-presentation attribute and as such cannot have the
                     // "inherit" value.  So, we don't call parse_one_presentation_attribute()
                     // for it, but rather call its parser directly.
-                    self.xml_lang = SpecifiedValue::Specified(attr.parse_to_parse_error(value)?);
+                    self.xml_lang = SpecifiedValue::Specified(attr.parse(value)?);
                 }
 
                 expanded_name!(svg "xml:space") => {
                     // xml:space is a non-presentation attribute and as such cannot have the
                     // "inherit" value.  So, we don't call parse_one_presentation_attribute()
                     // for it, but rather call its parser directly.
-                    self.xml_space = SpecifiedValue::Specified(attr.parse_to_parse_error(value)?);
+                    self.xml_space = SpecifiedValue::Specified(attr.parse(value)?);
                 }
 
                 _ => self.parse_one_presentation_attribute(attr, value)?,
@@ -674,11 +673,9 @@ impl SpecifiedValues {
 }
 
 // Parses the value for the type `T` of the property out of the Parser, including `inherit` values.
-fn parse_input_to_parse_error<'i, T>(
-    input: &mut Parser<'i, '_>,
-) -> Result<SpecifiedValue<T>, CssParseError<'i>>
+fn parse_input<'i, T>(input: &mut Parser<'i, '_>) -> Result<SpecifiedValue<T>, CssParseError<'i>>
 where
-    T: Property<ComputedValues> + Clone + Default + ParseToParseError,
+    T: Property<ComputedValues> + Clone + Default + Parse,
 {
     if input
         .try_parse(|p| p.expect_ident_matching("inherit"))
@@ -686,6 +683,6 @@ where
     {
         Ok(SpecifiedValue::Inherit)
     } else {
-        ParseToParseError::parse_to_parse_error(input).map(SpecifiedValue::Specified)
+        Parse::parse(input).map(SpecifiedValue::Specified)
     }
 }
diff --git a/rsvg_internals/src/property_bag.rs b/rsvg_internals/src/property_bag.rs
index 69239c29..685c45f5 100644
--- a/rsvg_internals/src/property_bag.rs
+++ b/rsvg_internals/src/property_bag.rs
@@ -75,8 +75,9 @@ impl<'a> PropertyBag<'a> {
                     // of https://www.w3.org/TR/xml-names11/
                     QualName::new(
                         prefix.map(Prefix::from),
-                        uri.map(Namespace::from).unwrap_or_else(|| element_ns.clone()),
-                        LocalName::from(localname)
+                        uri.map(Namespace::from)
+                            .unwrap_or_else(|| element_ns.clone()),
+                        LocalName::from(localname),
                     )
                 };
 
@@ -135,20 +136,24 @@ mod tests {
     #[test]
     fn property_bag_with_namespaces() {
         let attrs = [
-            (CString::new("rx").unwrap(),
-             CString::new("svg").unwrap(),
-             CString::new("http://www.w3.org/2000/svg";).unwrap(),
-             CString::new("1").unwrap()),
-
-            (CString::new("ry").unwrap(),
-             CString::new("svg").unwrap(),
-             CString::new("http://www.w3.org/2000/svg";).unwrap(),
-             CString::new("2").unwrap()),
-
-            (CString::new("empty").unwrap(),
-             CString::new("svg").unwrap(),
-             CString::new("http://www.w3.org/2000/svg";).unwrap(),
-             CString::new("").unwrap()),
+            (
+                CString::new("rx").unwrap(),
+                CString::new("svg").unwrap(),
+                CString::new("http://www.w3.org/2000/svg";).unwrap(),
+                CString::new("1").unwrap(),
+            ),
+            (
+                CString::new("ry").unwrap(),
+                CString::new("svg").unwrap(),
+                CString::new("http://www.w3.org/2000/svg";).unwrap(),
+                CString::new("2").unwrap(),
+            ),
+            (
+                CString::new("empty").unwrap(),
+                CString::new("svg").unwrap(),
+                CString::new("http://www.w3.org/2000/svg";).unwrap(),
+                CString::new("").unwrap(),
+            ),
         ];
 
         let mut v: Vec<*const libc::c_char> = Vec::new();
diff --git a/rsvg_internals/src/property_defs.rs b/rsvg_internals/src/property_defs.rs
index ce18d08a..f72ce3c7 100644
--- a/rsvg_internals/src/property_defs.rs
+++ b/rsvg_internals/src/property_defs.rs
@@ -8,7 +8,7 @@ use crate::font_props::{FontSizeSpec, FontWeightSpec, LetterSpacingSpec, SingleF
 use crate::iri::IRI;
 use crate::length::*;
 use crate::paint_server::PaintServer;
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 use crate::properties::ComputedValues;
 use crate::property_macros::Property;
 use crate::unit_interval::UnitInterval;
@@ -17,7 +17,7 @@ use crate::unit_interval::UnitInterval;
 make_property!(
     ComputedValues,
     BaselineShift,
-    default: Length::<Both>::parse_str_to_parse_error("0.0").unwrap(),
+    default: Length::<Both>::parse_str("0.0").unwrap(),
     newtype: Length<Both>,
     property_impl: {
         impl Property<ComputedValues> for BaselineShift {
@@ -41,11 +41,11 @@ make_property!(
         }
     },
     parse_impl: {
-        impl ParseToParseError for BaselineShift {
+        impl Parse for BaselineShift {
             // These values come from Inkscape's SP_CSS_BASELINE_SHIFT_(SUB/SUPER/BASELINE);
             // see sp_style_merge_baseline_shift_from_parent()
-            fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<BaselineShift, 
crate::error::CssParseError<'i>> {
-                parser.try_parse(|p| Ok(BaselineShift(Length::<Both>::parse_to_parse_error(p)?)))
+            fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<BaselineShift, 
crate::error::CssParseError<'i>> {
+                parser.try_parse(|p| Ok(BaselineShift(Length::<Both>::parse(p)?)))
                     .or_else(|_: CssParseError| {
                         Ok(parse_identifiers!(
                             parser,
@@ -66,7 +66,7 @@ make_property!(
     ClipPath,
     default: IRI::None,
     inherits_automatically: false,
-    newtype_parse_to_parse_error: IRI,
+    newtype_parse: IRI,
 );
 
 // https://www.w3.org/TR/SVG/masking.html#ClipRuleProperty
@@ -93,7 +93,7 @@ make_property!(
     // surrounding text.
     default: cssparser::RGBA::new(0, 0, 0, 0xff),
     inherits_automatically: true,
-    newtype_parse_to_parse_error: cssparser::RGBA,
+    newtype_parse: cssparser::RGBA,
 );
 
 // https://www.w3.org/TR/SVG11/painting.html#ColorInterpolationProperty
@@ -164,9 +164,9 @@ make_property!(
 make_property!(
     ComputedValues,
     Fill,
-    default: PaintServer::parse_str_to_parse_error("#000").unwrap(),
+    default: PaintServer::parse_str("#000").unwrap(),
     inherits_automatically: true,
-    newtype_parse_to_parse_error: PaintServer,
+    newtype_parse: PaintServer,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#FillOpacityProperty
@@ -175,7 +175,7 @@ make_property!(
     FillOpacity,
     default: UnitInterval(1.0),
     inherits_automatically: true,
-    newtype_parse_to_parse_error: UnitInterval,
+    newtype_parse: UnitInterval,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#FillRuleProperty
@@ -196,7 +196,7 @@ make_property!(
     Filter,
     default: IRI::None,
     inherits_automatically: false,
-    newtype_parse_to_parse_error: IRI,
+    newtype_parse: IRI,
 );
 
 // https://www.w3.org/TR/SVG/filters.html#FloodColorProperty
@@ -205,7 +205,7 @@ make_property!(
     FloodColor,
     default: cssparser::Color::RGBA(cssparser::RGBA::new(0, 0, 0, 0)),
     inherits_automatically: false,
-    newtype_parse_to_parse_error: cssparser::Color,
+    newtype_parse: cssparser::Color,
 );
 
 // https://www.w3.org/TR/SVG/filters.html#FloodOpacityProperty
@@ -214,7 +214,7 @@ make_property!(
     FloodOpacity,
     default: UnitInterval(1.0),
     inherits_automatically: false,
-    newtype_parse_to_parse_error: UnitInterval,
+    newtype_parse: UnitInterval,
 );
 
 // https://www.w3.org/TR/SVG/text.html#FontFamilyProperty
@@ -223,14 +223,14 @@ make_property!(
     FontFamily,
     default: SingleFontFamily("Times New Roman".to_string()),
     inherits_automatically: true,
-    newtype_parse_to_parse_error: SingleFontFamily,
+    newtype_parse: SingleFontFamily,
 );
 
 // https://www.w3.org/TR/SVG/text.html#FontSizeProperty
 make_property!(
     ComputedValues,
     FontSize,
-    default: FontSizeSpec::Value(Length::<Both>::parse_str_to_parse_error("12.0").unwrap()),
+    default: FontSizeSpec::Value(Length::<Both>::parse_str("12.0").unwrap()),
     newtype_parse: FontSizeSpec,
     property_impl: {
         impl Property<ComputedValues> for FontSize {
@@ -297,7 +297,7 @@ make_property!(
     FontWeight,
     default: FontWeightSpec::Normal,
     inherits_automatically: true,
-    newtype_parse_to_parse_error: FontWeightSpec,
+    newtype_parse: FontWeightSpec,
 );
 
 // https://www.w3.org/TR/SVG/text.html#LetterSpacingProperty
@@ -325,7 +325,7 @@ make_property!(
     LightingColor,
     default: cssparser::Color::RGBA(cssparser::RGBA::new(255, 255, 255, 255)),
     inherits_automatically: false,
-    newtype_parse_to_parse_error: cssparser::Color,
+    newtype_parse: cssparser::Color,
 );
 
 make_property!(
@@ -333,7 +333,7 @@ make_property!(
     Marker,
     default: IRI::None,
     inherits_automatically: true,
-    newtype_parse_to_parse_error: IRI,
+    newtype_parse: IRI,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#MarkerEndProperty
@@ -342,7 +342,7 @@ make_property!(
     MarkerEnd,
     default: IRI::None,
     inherits_automatically: true,
-    newtype_parse_to_parse_error: IRI,
+    newtype_parse: IRI,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#MarkerMidProperty
@@ -351,7 +351,7 @@ make_property!(
     MarkerMid,
     default: IRI::None,
     inherits_automatically: true,
-    newtype_parse_to_parse_error: IRI,
+    newtype_parse: IRI,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#MarkerStartProperty
@@ -360,7 +360,7 @@ make_property!(
     MarkerStart,
     default: IRI::None,
     inherits_automatically: true,
-    newtype_parse_to_parse_error: IRI,
+    newtype_parse: IRI,
 );
 
 // https://www.w3.org/TR/SVG/masking.html#MaskProperty
@@ -369,7 +369,7 @@ make_property!(
     Mask,
     default: IRI::None,
     inherits_automatically: false,
-    newtype_parse_to_parse_error: IRI,
+    newtype_parse: IRI,
 );
 
 // https://www.w3.org/TR/SVG/masking.html#OpacityProperty
@@ -378,7 +378,7 @@ make_property!(
     Opacity,
     default: UnitInterval(1.0),
     inherits_automatically: false,
-    newtype_parse_to_parse_error: UnitInterval,
+    newtype_parse: UnitInterval,
 );
 
 // https://www.w3.org/TR/SVG/masking.html#OverflowProperty
@@ -415,7 +415,7 @@ make_property!(
     StopColor,
     default: cssparser::Color::RGBA(cssparser::RGBA::new(0, 0, 0, 255)),
     inherits_automatically: false,
-    newtype_parse_to_parse_error: cssparser::Color,
+    newtype_parse: cssparser::Color,
 );
 
 // https://www.w3.org/TR/SVG/pservers.html#StopOpacityProperty
@@ -424,7 +424,7 @@ make_property!(
     StopOpacity,
     default: UnitInterval(1.0),
     inherits_automatically: false,
-    newtype_parse_to_parse_error: UnitInterval,
+    newtype_parse: UnitInterval,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#StrokeProperty
@@ -433,7 +433,7 @@ make_property!(
     Stroke,
     default: PaintServer::None,
     inherits_automatically: true,
-    newtype_parse_to_parse_error: PaintServer,
+    newtype_parse: PaintServer,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#StrokeDasharrayProperty
@@ -442,7 +442,7 @@ make_property!(
     StrokeDasharray,
     default: Dasharray::default(),
     inherits_automatically: true,
-    newtype_parse_to_parse_error: Dasharray,
+    newtype_parse: Dasharray,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#StrokeDashoffsetProperty
@@ -451,7 +451,7 @@ make_property!(
     StrokeDashoffset,
     default: Length::<Both>::default(),
     inherits_automatically: true,
-    newtype_parse_to_parse_error: Length<Both>,
+    newtype_parse: Length<Both>,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#StrokeLinecapProperty
@@ -486,7 +486,7 @@ make_property!(
     StrokeMiterlimit,
     default: 4f64,
     inherits_automatically: true,
-    newtype_parse_to_parse_error: f64,
+    newtype_parse: f64,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#StrokeOpacityProperty
@@ -495,16 +495,16 @@ make_property!(
     StrokeOpacity,
     default: UnitInterval(1.0),
     inherits_automatically: true,
-    newtype_parse_to_parse_error: UnitInterval,
+    newtype_parse: UnitInterval,
 );
 
 // https://www.w3.org/TR/SVG/painting.html#StrokeWidthProperty
 make_property!(
     ComputedValues,
     StrokeWidth,
-    default: Length::<Both>::parse_str_to_parse_error("1.0").unwrap(),
+    default: Length::<Both>::parse_str("1.0").unwrap(),
     inherits_automatically: true,
-    newtype_parse_to_parse_error: Length::<Both>,
+    newtype_parse: Length::<Both>,
 );
 
 // https://www.w3.org/TR/SVG/text.html#TextAnchorProperty
@@ -533,8 +533,8 @@ make_property!(
     }
 
     parse_impl: {
-        impl ParseToParseError for TextDecoration {
-            fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<TextDecoration, 
CssParseError<'i>> {
+        impl Parse for TextDecoration {
+            fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<TextDecoration, CssParseError<'i>> {
                 let mut overline = false;
                 let mut underline = false;
                 let mut strike = false;
@@ -569,7 +569,7 @@ make_property!(
 #[test]
 fn parses_text_decoration() {
     assert_eq!(
-        TextDecoration::parse_str_to_parse_error("none").unwrap(),
+        TextDecoration::parse_str("none").unwrap(),
         TextDecoration {
             overline: false,
             underline: false,
@@ -578,7 +578,7 @@ fn parses_text_decoration() {
     );
 
     assert_eq!(
-        TextDecoration::parse_str_to_parse_error("overline").unwrap(),
+        TextDecoration::parse_str("overline").unwrap(),
         TextDecoration {
             overline: true,
             underline: false,
@@ -587,7 +587,7 @@ fn parses_text_decoration() {
     );
 
     assert_eq!(
-        TextDecoration::parse_str_to_parse_error("underline").unwrap(),
+        TextDecoration::parse_str("underline").unwrap(),
         TextDecoration {
             overline: false,
             underline: true,
@@ -596,7 +596,7 @@ fn parses_text_decoration() {
     );
 
     assert_eq!(
-        TextDecoration::parse_str_to_parse_error("line-through").unwrap(),
+        TextDecoration::parse_str("line-through").unwrap(),
         TextDecoration {
             overline: false,
             underline: false,
@@ -605,7 +605,7 @@ fn parses_text_decoration() {
     );
 
     assert_eq!(
-        TextDecoration::parse_str_to_parse_error("underline overline").unwrap(),
+        TextDecoration::parse_str("underline overline").unwrap(),
         TextDecoration {
             overline: true,
             underline: true,
@@ -613,7 +613,7 @@ fn parses_text_decoration() {
         }
     );
 
-    assert!(TextDecoration::parse_str_to_parse_error("airline").is_err())
+    assert!(TextDecoration::parse_str("airline").is_err())
 }
 
 // https://www.w3.org/TR/SVG/painting.html#TextRenderingProperty
@@ -688,8 +688,8 @@ make_property!(
     inherits_automatically: true,
     newtype: String,
     parse_impl: {
-        impl ParseToParseError for XmlLang {
-            fn parse_to_parse_error<'i>(
+        impl Parse for XmlLang {
+            fn parse<'i>(
                 parser: &mut Parser<'i, '_>,
             ) -> Result<XmlLang, CssParseError<'i>> {
                 Ok(XmlLang(parser.expect_ident()?.to_string()))
@@ -702,11 +702,11 @@ make_property!(
 #[test]
 fn parses_xml_lang() {
     assert_eq!(
-        XmlLang::parse_str_to_parse_error("es-MX").unwrap(),
+        XmlLang::parse_str("es-MX").unwrap(),
         XmlLang("es-MX".to_string())
     );
 
-    assert!(XmlLang::parse_str_to_parse_error("").is_err());
+    assert!(XmlLang::parse_str("").is_err());
 }
 
 make_property!(
diff --git a/rsvg_internals/src/property_macros.rs b/rsvg_internals/src/property_macros.rs
index a24d1a2a..33211fca 100644
--- a/rsvg_internals/src/property_macros.rs
+++ b/rsvg_internals/src/property_macros.rs
@@ -45,8 +45,8 @@ macro_rules! make_property {
         impl_default!($name, $name::$default);
         impl_property!($computed_values_type, $name, $inherits_automatically);
 
-        impl crate::parsers::ParseToParseError for $name {
-            fn parse_to_parse_error<'i>(parser: &mut ::cssparser::Parser<'i, '_>) -> Result<$name, 
crate::error::CssParseError<'i>> {
+        impl crate::parsers::Parse for $name {
+            fn parse<'i>(parser: &mut ::cssparser::Parser<'i, '_>) -> Result<$name, 
crate::error::CssParseError<'i>> {
                 Ok(parse_identifiers!(
                     parser,
                     $($str_prop => $name::$variant,)+
@@ -68,31 +68,12 @@ macro_rules! make_property {
         impl_property!($computed_values_type, $name, $inherits_automatically);
 
         impl crate::parsers::Parse for $name {
-            fn parse(parser: &mut ::cssparser::Parser<'_, '_>) -> Result<$name, 
crate::error::ValueErrorKind> {
+            fn parse<'i>(parser: &mut ::cssparser::Parser<'i, '_>) -> Result<$name, 
crate::error::CssParseError<'i>> {
                 Ok($name(<$type as crate::parsers::Parse>::parse(parser)?))
             }
         }
     };
 
-    ($computed_values_type: ty,
-     $name: ident,
-     default: $default: expr,
-     inherits_automatically: $inherits_automatically: expr,
-     newtype_parse_to_parse_error: $type: ty,
-    ) => {
-        #[derive(Debug, Clone, PartialEq)]
-        pub struct $name(pub $type);
-
-        impl_default!($name, $name($default));
-        impl_property!($computed_values_type, $name, $inherits_automatically);
-
-        impl crate::parsers::ParseToParseError for $name {
-            fn parse_to_parse_error<'i>(parser: &mut ::cssparser::Parser<'i, '_>) -> Result<$name, 
crate::error::CssParseError<'i>> {
-                Ok($name(<$type as crate::parsers::ParseToParseError>::parse_to_parse_error(parser)?))
-            }
-        }
-    };
-
     ($computed_values_type: ty,
      $name: ident,
      default: $default: expr,
@@ -106,9 +87,9 @@ macro_rules! make_property {
 
         $prop
 
-        impl crate::parsers::ParseToParseError for $name {
-            fn parse_to_parse_error<'i>(parser: &mut ::cssparser::Parser<'i, '_>) -> Result<$name, 
crate::error::CssParseError<'i>> {
-                Ok($name(<$type as crate::parsers::ParseToParseError>::parse_to_parse_error(parser)?))
+        impl crate::parsers::Parse for $name {
+            fn parse<'i>(parser: &mut ::cssparser::Parser<'i, '_>) -> Result<$name, 
crate::error::CssParseError<'i>> {
+                Ok($name(<$type as crate::parsers::Parse>::parse(parser)?))
             }
         }
     };
@@ -194,7 +175,7 @@ macro_rules! impl_property {
 mod tests {
     use super::*;
 
-    use crate::parsers::ParseToParseError;
+    use crate::parsers::Parse;
     use cssparser::RGBA;
 
     #[test]
@@ -213,8 +194,8 @@ mod tests {
 
         assert_eq!(<Foo as Default>::default(), Foo::Def);
         assert_eq!(<Foo as Property<()>>::inherits_automatically(), true);
-        assert!(<Foo as ParseToParseError>::parse_str_to_parse_error("blargh").is_err());
-        assert_eq!(<Foo as ParseToParseError>::parse_str_to_parse_error("bar"), Ok(Foo::Bar));
+        assert!(<Foo as Parse>::parse_str("blargh").is_err());
+        assert_eq!(<Foo as Parse>::parse_str("bar"), Ok(Foo::Bar));
     }
 
     #[test]
@@ -243,7 +224,7 @@ mod tests {
         }
 
         let color = RGBA::new(1, 1, 1, 1);
-        let a = <AddColor as ParseToParseError>::parse_str_to_parse_error("#02030405").unwrap();
+        let a = <AddColor as Parse>::parse_str("#02030405").unwrap();
         let b = a.compute(&color);
 
         assert_eq!(b, AddColor(RGBA::new(3, 4, 5, 6)));
diff --git a/rsvg_internals/src/shapes.rs b/rsvg_internals/src/shapes.rs
index 1c9f142d..bb495696 100644
--- a/rsvg_internals/src/shapes.rs
+++ b/rsvg_internals/src/shapes.rs
@@ -3,8 +3,8 @@
 
 use cairo;
 use markup5ever::{expanded_name, local_name, namespace_url, ns};
-use std::rc::Rc;
 use std::ops::Deref;
+use std::rc::Rc;
 
 use crate::bbox::BoundingBox;
 use crate::drawing_ctx::DrawingCtx;
@@ -12,7 +12,7 @@ use crate::error::*;
 use crate::length::*;
 use crate::marker;
 use crate::node::*;
-use crate::parsers::{optional_comma, ParseToParseError, ParseValueToParseError};
+use crate::parsers::{optional_comma, Parse, ParseValue};
 use crate::path_builder::*;
 use crate::path_parser;
 use crate::properties::ComputedValues;
@@ -65,10 +65,7 @@ pub struct Shape {
 
 impl Shape {
     fn new(builder: Rc<PathBuilder>, markers: Markers) -> Shape {
-        Shape {
-            builder,
-            markers,
-        }
+        Shape { builder, markers }
     }
 
     fn draw(
@@ -177,8 +174,7 @@ impl NodeTrait for Path {
     ) -> Result<BoundingBox, RenderingError> {
         if let Some(builder) = self.builder.as_ref() {
             let values = cascaded.get();
-            Shape::new(builder.clone(), Markers::Yes)
-                .draw(node, values, draw_ctx, clipping)
+            Shape::new(builder.clone(), Markers::Yes).draw(node, values, draw_ctx, clipping)
         } else {
             Ok(draw_ctx.empty_bbox())
         }
@@ -198,14 +194,14 @@ impl Deref for Points {
 
 // Parse a list-of-points as for polyline and polygon elements
 // https://www.w3.org/TR/SVG/shapes.html#PointsBNF
-impl ParseToParseError for Points {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<Points, CssParseError<'i>> {
+impl Parse for Points {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Points, CssParseError<'i>> {
         let mut v = Vec::new();
 
         loop {
-            let x = f64::parse_to_parse_error(parser)?;
+            let x = f64::parse(parser)?;
             optional_comma(parser);
-            let y = f64::parse_to_parse_error(parser)?;
+            let y = f64::parse(parser)?;
 
             v.push((x, y));
 
@@ -252,7 +248,7 @@ impl NodeTrait for Polygon {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             if attr.expanded() == expanded_name!(svg "points") {
-                self.points = attr.parse_to_parse_error(value).map(Some)?;
+                self.points = attr.parse(value).map(Some)?;
             }
         }
 
@@ -281,7 +277,7 @@ impl NodeTrait for Polyline {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             if attr.expanded() == expanded_name!(svg "points") {
-                self.points = attr.parse_to_parse_error(value).map(Some)?;
+                self.points = attr.parse(value).map(Some)?;
             }
         }
 
@@ -296,8 +292,11 @@ impl NodeTrait for Polyline {
         clipping: bool,
     ) -> Result<BoundingBox, RenderingError> {
         let values = cascaded.get();
-        Shape::new(Rc::new(make_poly(self.points.as_ref(), false)), Markers::Yes)
-            .draw(node, values, draw_ctx, clipping)
+        Shape::new(
+            Rc::new(make_poly(self.points.as_ref(), false)),
+            Markers::Yes,
+        )
+        .draw(node, values, draw_ctx, clipping)
     }
 }
 
@@ -313,10 +312,10 @@ impl NodeTrait for Line {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "x1") => self.x1 = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "y1") => self.y1 = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "x2") => self.x2 = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "y2") => self.y2 = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "x1") => self.x1 = attr.parse(value)?,
+                expanded_name!(svg "y1") => self.y1 = attr.parse(value)?,
+                expanded_name!(svg "x2") => self.x2 = attr.parse(value)?,
+                expanded_name!(svg "y2") => self.y2 = attr.parse(value)?,
                 _ => (),
             }
         }
@@ -332,17 +331,16 @@ impl NodeTrait for Line {
         clipping: bool,
     ) -> Result<BoundingBox, RenderingError> {
         let values = cascaded.get();
-        Shape::new(Rc::new(self.make_path_builder(values, draw_ctx)), Markers::Yes)
-            .draw(node, values, draw_ctx, clipping)
+        Shape::new(
+            Rc::new(self.make_path_builder(values, draw_ctx)),
+            Markers::Yes,
+        )
+        .draw(node, values, draw_ctx, clipping)
     }
 }
 
 impl Line {
-    fn make_path_builder(
-        &self,
-        values: &ComputedValues,
-        draw_ctx: &mut DrawingCtx,
-    ) -> PathBuilder {
+    fn make_path_builder(&self, values: &ComputedValues, draw_ctx: &mut DrawingCtx) -> PathBuilder {
         let mut builder = PathBuilder::new();
 
         let params = draw_ctx.get_view_params();
@@ -375,24 +373,24 @@ impl NodeTrait for Rect {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "x") => self.x = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "y") => self.y = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "x") => self.x = attr.parse(value)?,
+                expanded_name!(svg "y") => self.y = attr.parse(value)?,
                 expanded_name!(svg "width") => {
                     self.w =
-                        attr.parse_to_parse_error_and_validate(value, 
Length::<Horizontal>::check_nonnegative)?
+                        attr.parse_and_validate(value, Length::<Horizontal>::check_nonnegative)?
                 }
                 expanded_name!(svg "height") => {
                     self.h =
-                        attr.parse_to_parse_error_and_validate(value, Length::<Vertical>::check_nonnegative)?
+                        attr.parse_and_validate(value, Length::<Vertical>::check_nonnegative)?
                 }
                 expanded_name!(svg "rx") => {
                     self.rx = attr
-                        .parse_to_parse_error_and_validate(value, Length::<Horizontal>::check_nonnegative)
+                        .parse_and_validate(value, Length::<Horizontal>::check_nonnegative)
                         .map(Some)?
                 }
                 expanded_name!(svg "ry") => {
                     self.ry = attr
-                        .parse_to_parse_error_and_validate(value, Length::<Vertical>::check_nonnegative)
+                        .parse_and_validate(value, Length::<Vertical>::check_nonnegative)
                         .map(Some)?
                 }
                 _ => (),
@@ -410,17 +408,16 @@ impl NodeTrait for Rect {
         clipping: bool,
     ) -> Result<BoundingBox, RenderingError> {
         let values = cascaded.get();
-        Shape::new(Rc::new(self.make_path_builder(values, draw_ctx)), Markers::No)
-            .draw(node, values, draw_ctx, clipping)
+        Shape::new(
+            Rc::new(self.make_path_builder(values, draw_ctx)),
+            Markers::No,
+        )
+        .draw(node, values, draw_ctx, clipping)
     }
 }
 
 impl Rect {
-    fn make_path_builder(
-        &self,
-        values: &ComputedValues,
-        draw_ctx: &mut DrawingCtx,
-    ) -> PathBuilder {
+    fn make_path_builder(&self, values: &ComputedValues, draw_ctx: &mut DrawingCtx) -> PathBuilder {
         let params = draw_ctx.get_view_params();
 
         let x = self.x.normalize(values, &params);
@@ -603,10 +600,10 @@ impl NodeTrait for Circle {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "cx") => self.cx = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "cy") => self.cy = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "cx") => self.cx = attr.parse(value)?,
+                expanded_name!(svg "cy") => self.cy = attr.parse(value)?,
                 expanded_name!(svg "r") => {
-                    self.r = attr.parse_to_parse_error_and_validate(value, 
Length::<Both>::check_nonnegative)?
+                    self.r = attr.parse_and_validate(value, Length::<Both>::check_nonnegative)?
                 }
                 _ => (),
             }
@@ -623,17 +620,16 @@ impl NodeTrait for Circle {
         clipping: bool,
     ) -> Result<BoundingBox, RenderingError> {
         let values = cascaded.get();
-        Shape::new(Rc::new(self.make_path_builder(values, draw_ctx)), Markers::No)
-            .draw(node, values, draw_ctx, clipping)
+        Shape::new(
+            Rc::new(self.make_path_builder(values, draw_ctx)),
+            Markers::No,
+        )
+        .draw(node, values, draw_ctx, clipping)
     }
 }
 
 impl Circle {
-    fn make_path_builder(
-        &self,
-        values: &ComputedValues,
-        draw_ctx: &mut DrawingCtx,
-    ) -> PathBuilder {
+    fn make_path_builder(&self, values: &ComputedValues, draw_ctx: &mut DrawingCtx) -> PathBuilder {
         let params = draw_ctx.get_view_params();
 
         let cx = self.cx.normalize(values, &params);
@@ -656,15 +652,15 @@ impl NodeTrait for Ellipse {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "cx") => self.cx = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "cy") => self.cy = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "cx") => self.cx = attr.parse(value)?,
+                expanded_name!(svg "cy") => self.cy = attr.parse(value)?,
                 expanded_name!(svg "rx") => {
                     self.rx =
-                        attr.parse_to_parse_error_and_validate(value, 
Length::<Horizontal>::check_nonnegative)?
+                        attr.parse_and_validate(value, Length::<Horizontal>::check_nonnegative)?
                 }
                 expanded_name!(svg "ry") => {
                     self.ry =
-                        attr.parse_to_parse_error_and_validate(value, Length::<Vertical>::check_nonnegative)?
+                        attr.parse_and_validate(value, Length::<Vertical>::check_nonnegative)?
                 }
                 _ => (),
             }
@@ -681,17 +677,16 @@ impl NodeTrait for Ellipse {
         clipping: bool,
     ) -> Result<BoundingBox, RenderingError> {
         let values = cascaded.get();
-        Shape::new(Rc::new(self.make_path_builder(values, draw_ctx)), Markers::No)
-            .draw(node, values, draw_ctx, clipping)
+        Shape::new(
+            Rc::new(self.make_path_builder(values, draw_ctx)),
+            Markers::No,
+        )
+        .draw(node, values, draw_ctx, clipping)
     }
 }
 
 impl Ellipse {
-    fn make_path_builder(
-        &self,
-        values: &ComputedValues,
-        draw_ctx: &mut DrawingCtx,
-    ) -> PathBuilder {
+    fn make_path_builder(&self, values: &ComputedValues, draw_ctx: &mut DrawingCtx) -> PathBuilder {
         let params = draw_ctx.get_view_params();
 
         let cx = self.cx.normalize(values, &params);
@@ -709,32 +704,32 @@ mod tests {
 
     #[test]
     fn parses_points() {
-        assert_eq!(Points::parse_str_to_parse_error(" 1 2 "), Ok(Points(vec![(1.0, 2.0)])));
+        assert_eq!(Points::parse_str(" 1 2 "), Ok(Points(vec![(1.0, 2.0)])));
         assert_eq!(
-            Points::parse_str_to_parse_error("1 2 3 4"),
+            Points::parse_str("1 2 3 4"),
             Ok(Points(vec![(1.0, 2.0), (3.0, 4.0)]))
         );
         assert_eq!(
-            Points::parse_str_to_parse_error("1,2,3,4"),
+            Points::parse_str("1,2,3,4"),
             Ok(Points(vec![(1.0, 2.0), (3.0, 4.0)]))
         );
         assert_eq!(
-            Points::parse_str_to_parse_error("1,2 3,4"),
+            Points::parse_str("1,2 3,4"),
             Ok(Points(vec![(1.0, 2.0), (3.0, 4.0)]))
         );
         assert_eq!(
-            Points::parse_str_to_parse_error("1,2 -3,4"),
+            Points::parse_str("1,2 -3,4"),
             Ok(Points(vec![(1.0, 2.0), (-3.0, 4.0)]))
         );
         assert_eq!(
-            Points::parse_str_to_parse_error("1,2,-3,4"),
+            Points::parse_str("1,2,-3,4"),
             Ok(Points(vec![(1.0, 2.0), (-3.0, 4.0)]))
         );
     }
 
     #[test]
     fn errors_on_invalid_points() {
-        assert!(Points::parse_str_to_parse_error("-1-2-3-4").is_err());
-        assert!(Points::parse_str_to_parse_error("1 2-3,-4").is_err());
+        assert!(Points::parse_str("-1-2-3-4").is_err());
+        assert!(Points::parse_str("1 2-3,-4").is_err());
     }
 }
diff --git a/rsvg_internals/src/structure.rs b/rsvg_internals/src/structure.rs
index 9097b418..974f2573 100644
--- a/rsvg_internals/src/structure.rs
+++ b/rsvg_internals/src/structure.rs
@@ -11,7 +11,7 @@ use crate::error::*;
 use crate::float_eq_cairo::ApproxEqCairo;
 use crate::length::*;
 use crate::node::*;
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
 use crate::property_defs::Overflow;
@@ -149,16 +149,16 @@ impl Svg {
         // these defaults are per the spec
         let x = self
             .x
-            .unwrap_or_else(|| Length::<Horizontal>::parse_str_to_parse_error("0").unwrap());
+            .unwrap_or_else(|| Length::<Horizontal>::parse_str("0").unwrap());
         let y = self
             .y
-            .unwrap_or_else(|| Length::<Vertical>::parse_str_to_parse_error("0").unwrap());
+            .unwrap_or_else(|| Length::<Vertical>::parse_str("0").unwrap());
         let w = self
             .w
-            .unwrap_or_else(|| Length::<Horizontal>::parse_str_to_parse_error("100%").unwrap());
+            .unwrap_or_else(|| Length::<Horizontal>::parse_str("100%").unwrap());
         let h = self
             .h
-            .unwrap_or_else(|| Length::<Vertical>::parse_str_to_parse_error("100%").unwrap());
+            .unwrap_or_else(|| Length::<Vertical>::parse_str("100%").unwrap());
 
         (x, y, w, h)
     }
@@ -184,19 +184,20 @@ impl NodeTrait for Svg {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "preserveAspectRatio") => {
-                    self.preserve_aspect_ratio = attr.parse_to_parse_error(value)?
+                    self.preserve_aspect_ratio = attr.parse(value)?
                 }
-                expanded_name!(svg "x") if is_inner_svg => self.x = Some(attr.parse_to_parse_error(value)?),
-                expanded_name!(svg "y") if is_inner_svg => self.y = Some(attr.parse_to_parse_error(value)?),
+                expanded_name!(svg "x") if is_inner_svg => self.x = Some(attr.parse(value)?),
+                expanded_name!(svg "y") if is_inner_svg => self.y = Some(attr.parse(value)?),
                 expanded_name!(svg "width") => {
-                    self.w =
-                        Some(attr.parse_to_parse_error_and_validate(value, 
Length::<Horizontal>::check_nonnegative)?)
+                    self.w = Some(
+                        attr.parse_and_validate(value, Length::<Horizontal>::check_nonnegative)?,
+                    )
                 }
                 expanded_name!(svg "height") => {
                     self.h =
-                        Some(attr.parse_to_parse_error_and_validate(value, 
Length::<Vertical>::check_nonnegative)?)
+                        Some(attr.parse_and_validate(value, Length::<Vertical>::check_nonnegative)?)
                 }
-                expanded_name!(svg "viewBox") => self.vbox = attr.parse_to_parse_error(value).map(Some)?,
+                expanded_name!(svg "viewBox") => self.vbox = attr.parse(value).map(Some)?,
                 _ => (),
             }
         }
@@ -278,16 +279,16 @@ impl NodeTrait for Use {
                 expanded_name!(xlink "href") => {
                     self.link = Some(Fragment::parse(value).attribute(attr)?)
                 }
-                expanded_name!(svg "x") => self.x = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "y") => self.y = attr.parse_to_parse_error(value)?,
+                expanded_name!(svg "x") => self.x = attr.parse(value)?,
+                expanded_name!(svg "y") => self.y = attr.parse(value)?,
                 expanded_name!(svg "width") => {
                     self.w = attr
-                        .parse_to_parse_error_and_validate(value, Length::<Horizontal>::check_nonnegative)
+                        .parse_and_validate(value, Length::<Horizontal>::check_nonnegative)
                         .map(Some)?
                 }
                 expanded_name!(svg "height") => {
                     self.h = attr
-                        .parse_to_parse_error_and_validate(value, Length::<Vertical>::check_nonnegative)
+                        .parse_and_validate(value, Length::<Vertical>::check_nonnegative)
                         .map(Some)?
                 }
                 _ => (),
@@ -362,11 +363,11 @@ impl NodeTrait for Use {
 
         let nw = self
             .w
-            .unwrap_or_else(|| Length::<Horizontal>::parse_str_to_parse_error("100%").unwrap())
+            .unwrap_or_else(|| Length::<Horizontal>::parse_str("100%").unwrap())
             .normalize(values, &params);
         let nh = self
             .h
-            .unwrap_or_else(|| Length::<Vertical>::parse_str_to_parse_error("100%").unwrap())
+            .unwrap_or_else(|| Length::<Vertical>::parse_str("100%").unwrap())
             .normalize(values, &params);
 
         // width or height set to 0 disables rendering of the element
@@ -427,9 +428,9 @@ impl NodeTrait for Symbol {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
                 expanded_name!(svg "preserveAspectRatio") => {
-                    self.preserve_aspect_ratio = attr.parse_to_parse_error(value)?
+                    self.preserve_aspect_ratio = attr.parse(value)?
                 }
-                expanded_name!(svg "viewBox") => self.vbox = attr.parse_to_parse_error(value).map(Some)?,
+                expanded_name!(svg "viewBox") => self.vbox = attr.parse(value).map(Some)?,
                 _ => (),
             }
         }
diff --git a/rsvg_internals/src/style.rs b/rsvg_internals/src/style.rs
index 8c794044..296ab15f 100644
--- a/rsvg_internals/src/style.rs
+++ b/rsvg_internals/src/style.rs
@@ -5,7 +5,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::error::*;
 use crate::node::{NodeResult, NodeTrait, RsvgNode};
-use crate::parsers::{ParseToParseError, ParseValueToParseError};
+use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 
 /// Represents the syntax used in the <style> node.
@@ -19,8 +19,8 @@ pub enum StyleType {
     TextCss,
 }
 
-impl ParseToParseError for StyleType {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<StyleType, CssParseError<'i>> {
+impl Parse for StyleType {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<StyleType, CssParseError<'i>> {
         parser.expect_ident_matching("text/css")?;
         Ok(StyleType::TextCss)
     }
@@ -45,7 +45,7 @@ impl NodeTrait for Style {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             if attr.expanded() == expanded_name!(svg "type") {
-                self.type_ = Some(attr.parse_to_parse_error(value)?);
+                self.type_ = Some(attr.parse(value)?);
             }
         }
 
diff --git a/rsvg_internals/src/text.rs b/rsvg_internals/src/text.rs
index c95bb4bd..ff10295f 100644
--- a/rsvg_internals/src/text.rs
+++ b/rsvg_internals/src/text.rs
@@ -15,7 +15,7 @@ use crate::float_eq_cairo::ApproxEqCairo;
 use crate::font_props::FontWeightSpec;
 use crate::length::*;
 use crate::node::{CascadedValues, NodeResult, NodeTrait, NodeType, RsvgNode};
-use crate::parsers::ParseValueToParseError;
+use crate::parsers::ParseValue;
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
 use crate::property_defs::{
@@ -602,10 +602,10 @@ impl NodeTrait for Text {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "x") => self.x = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "y") => self.y = attr.parse_to_parse_error(value)?,
-                expanded_name!(svg "dx") => self.dx = attr.parse_to_parse_error(value).map(Some)?,
-                expanded_name!(svg "dy") => self.dy = attr.parse_to_parse_error(value).map(Some)?,
+                expanded_name!(svg "x") => self.x = attr.parse(value)?,
+                expanded_name!(svg "y") => self.y = attr.parse(value)?,
+                expanded_name!(svg "dx") => self.dx = attr.parse(value).map(Some)?,
+                expanded_name!(svg "dy") => self.dy = attr.parse(value).map(Some)?,
                 _ => (),
             }
         }
@@ -762,10 +762,10 @@ impl NodeTrait for TSpan {
     fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
-                expanded_name!(svg "x") => self.x = attr.parse_to_parse_error(value).map(Some)?,
-                expanded_name!(svg "y") => self.y = attr.parse_to_parse_error(value).map(Some)?,
-                expanded_name!(svg "dx") => self.dx = attr.parse_to_parse_error(value).map(Some)?,
-                expanded_name!(svg "dy") => self.dy = attr.parse_to_parse_error(value).map(Some)?,
+                expanded_name!(svg "x") => self.x = attr.parse(value).map(Some)?,
+                expanded_name!(svg "y") => self.y = attr.parse(value).map(Some)?,
+                expanded_name!(svg "dx") => self.dx = attr.parse(value).map(Some)?,
+                expanded_name!(svg "dy") => self.dy = attr.parse(value).map(Some)?,
                 _ => (),
             }
         }
diff --git a/rsvg_internals/src/transform.rs b/rsvg_internals/src/transform.rs
index 5abd9a03..e623adb4 100644
--- a/rsvg_internals/src/transform.rs
+++ b/rsvg_internals/src/transform.rs
@@ -7,12 +7,10 @@ use std::f64::consts::*;
 use cssparser::{self, Parser, Token};
 
 use crate::error::*;
-use crate::parsers::{optional_comma, ParseToParseError};
+use crate::parsers::{optional_comma, Parse};
 
-impl ParseToParseError for cairo::Matrix {
-    fn parse_to_parse_error<'i>(
-        parser: &mut Parser<'i, '_>,
-    ) -> Result<cairo::Matrix, CssParseError<'i>> {
+impl Parse for cairo::Matrix {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
         let loc = parser.current_source_location();
 
         let matrix = parse_transform_list(parser)?;
@@ -86,22 +84,22 @@ fn parse_transform_function<'i>(
 
 fn parse_matrix_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
     parser.parse_nested_block(|p| {
-        let xx = f64::parse_to_parse_error(p)?;
+        let xx = f64::parse(p)?;
         optional_comma(p);
 
-        let yx = f64::parse_to_parse_error(p)?;
+        let yx = f64::parse(p)?;
         optional_comma(p);
 
-        let xy = f64::parse_to_parse_error(p)?;
+        let xy = f64::parse(p)?;
         optional_comma(p);
 
-        let yy = f64::parse_to_parse_error(p)?;
+        let yy = f64::parse(p)?;
         optional_comma(p);
 
-        let x0 = f64::parse_to_parse_error(p)?;
+        let x0 = f64::parse(p)?;
         optional_comma(p);
 
-        let y0 = f64::parse_to_parse_error(p)?;
+        let y0 = f64::parse(p)?;
 
         Ok(cairo::Matrix::new(xx, yx, xy, yy, x0, y0))
     })
@@ -111,12 +109,12 @@ 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)?;
+        let tx = f64::parse(p)?;
 
         let ty = p
             .try_parse(|p| {
                 optional_comma(p);
-                f64::parse_to_parse_error(p)
+                f64::parse(p)
             })
             .unwrap_or(0.0);
 
@@ -126,12 +124,12 @@ fn parse_translate_args<'i>(
 
 fn parse_scale_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
     parser.parse_nested_block(|p| {
-        let x = f64::parse_to_parse_error(p)?;
+        let x = f64::parse(p)?;
 
         let y = p
             .try_parse(|p| {
                 optional_comma(p);
-                f64::parse_to_parse_error(p)
+                f64::parse(p)
             })
             .unwrap_or(x);
 
@@ -141,15 +139,15 @@ fn parse_scale_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, Cs
 
 fn parse_rotate_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
     parser.parse_nested_block(|p| {
-        let angle = f64::parse_to_parse_error(p)? * PI / 180.0;
+        let angle = f64::parse(p)? * PI / 180.0;
 
         let (tx, ty) = p
             .try_parse(|p| -> Result<_, CssParseError> {
                 optional_comma(p);
-                let tx = f64::parse_to_parse_error(p)?;
+                let tx = f64::parse(p)?;
 
                 optional_comma(p);
-                let ty = f64::parse_to_parse_error(p)?;
+                let ty = f64::parse(p)?;
 
                 Ok((tx, ty))
             })
@@ -167,14 +165,14 @@ fn parse_rotate_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, C
 
 fn parse_skewx_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
     parser.parse_nested_block(|p| {
-        let a = f64::parse_to_parse_error(p)? * PI / 180.0;
+        let a = f64::parse(p)? * PI / 180.0;
         Ok(cairo::Matrix::new(1.0, 0.0, a.tan(), 1.0, 0.0, 0.0))
     })
 }
 
 fn parse_skewy_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
     parser.parse_nested_block(|p| {
-        let a = f64::parse_to_parse_error(p)? * PI / 180.0;
+        let a = f64::parse(p)? * PI / 180.0;
         Ok(cairo::Matrix::new(1.0, a.tan(), 0.0, 1.0, 0.0, 0.0))
     })
 }
@@ -200,7 +198,7 @@ mod tests {
     use std::f64;
 
     fn parse_transform(s: &str) -> Result<cairo::Matrix, CssParseError> {
-        cairo::Matrix::parse_str_to_parse_error(s)
+        cairo::Matrix::parse_str(s)
     }
 
     fn assert_matrix_eq(a: &cairo::Matrix, b: &cairo::Matrix) {
diff --git a/rsvg_internals/src/unit_interval.rs b/rsvg_internals/src/unit_interval.rs
index 34575692..2aad1c3f 100644
--- a/rsvg_internals/src/unit_interval.rs
+++ b/rsvg_internals/src/unit_interval.rs
@@ -3,7 +3,7 @@
 use cssparser::Parser;
 
 use crate::error::*;
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 use crate::util;
 
 #[derive(Debug, Default, Copy, Clone, PartialEq, PartialOrd)]
@@ -15,9 +15,9 @@ impl UnitInterval {
     }
 }
 
-impl ParseToParseError for UnitInterval {
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<UnitInterval, CssParseError<'i>> {
-        let x = f64::parse_to_parse_error(parser)?;
+impl Parse for UnitInterval {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<UnitInterval, CssParseError<'i>> {
+        let x = f64::parse(parser)?;
         Ok(UnitInterval::clamp(x))
     }
 }
@@ -44,23 +44,23 @@ mod tests {
 
     #[test]
     fn parses_number() {
-        assert_eq!(UnitInterval::parse_str_to_parse_error("0"), Ok(UnitInterval(0.0)));
-        assert_eq!(UnitInterval::parse_str_to_parse_error("1"), Ok(UnitInterval(1.0)));
-        assert_eq!(UnitInterval::parse_str_to_parse_error("0.5"), Ok(UnitInterval(0.5)));
+        assert_eq!(UnitInterval::parse_str("0"), Ok(UnitInterval(0.0)));
+        assert_eq!(UnitInterval::parse_str("1"), Ok(UnitInterval(1.0)));
+        assert_eq!(UnitInterval::parse_str("0.5"), Ok(UnitInterval(0.5)));
     }
 
     #[test]
     fn parses_out_of_range_number() {
-        assert_eq!(UnitInterval::parse_str_to_parse_error("-10"), Ok(UnitInterval(0.0)));
-        assert_eq!(UnitInterval::parse_str_to_parse_error("10"), Ok(UnitInterval(1.0)));
+        assert_eq!(UnitInterval::parse_str("-10"), Ok(UnitInterval(0.0)));
+        assert_eq!(UnitInterval::parse_str("10"), Ok(UnitInterval(1.0)));
     }
 
     #[test]
     fn errors_on_invalid_input() {
-        assert!(UnitInterval::parse_str_to_parse_error("").is_err());
-        assert!(UnitInterval::parse_str_to_parse_error("foo").is_err());
-        assert!(UnitInterval::parse_str_to_parse_error("-x").is_err());
-        assert!(UnitInterval::parse_str_to_parse_error("0.0foo").is_err());
+        assert!(UnitInterval::parse_str("").is_err());
+        assert!(UnitInterval::parse_str("foo").is_err());
+        assert!(UnitInterval::parse_str("-x").is_err());
+        assert!(UnitInterval::parse_str("0.0foo").is_err());
     }
 
     #[test]
diff --git a/rsvg_internals/src/viewbox.rs b/rsvg_internals/src/viewbox.rs
index 360466d9..9a6fa247 100644
--- a/rsvg_internals/src/viewbox.rs
+++ b/rsvg_internals/src/viewbox.rs
@@ -4,13 +4,13 @@ use cssparser::Parser;
 
 use crate::error::*;
 use crate::number_list::{NumberList, NumberListLength};
-use crate::parsers::ParseToParseError;
+use crate::parsers::Parse;
 use crate::rect::Rect;
 
 #[derive(Debug, Copy, Clone, PartialEq)]
 pub struct ViewBox(pub Rect);
 
-impl ParseToParseError for ViewBox {
+impl Parse for ViewBox {
     // Parse a viewBox attribute
     // https://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute
     //
@@ -19,18 +19,19 @@ impl ParseToParseError for ViewBox {
     // x, y, w, h
     //
     // Where w and h must be nonnegative.
-    fn parse_to_parse_error<'i>(parser: &mut Parser<'i, '_>) -> Result<ViewBox, CssParseError<'i>> {
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<ViewBox, CssParseError<'i>> {
         let loc = parser.current_source_location();
 
-        let NumberList(v) =
-            NumberList::parse_to_parse_error(parser, NumberListLength::Exact(4))?;
+        let NumberList(v) = NumberList::parse(parser, NumberListLength::Exact(4))?;
 
         let (x, y, width, height) = (v[0], v[1], v[2], v[3]);
 
         if width >= 0.0 && height >= 0.0 {
             Ok(ViewBox(Rect::new(x, y, x + width, y + height)))
         } else {
-            Err(loc.new_custom_error(ValueErrorKind::value_error("width and height must not be negative")))
+            Err(loc.new_custom_error(ValueErrorKind::value_error(
+                "width and height must not be negative",
+            )))
         }
     }
 }
@@ -42,25 +43,25 @@ mod tests {
     #[test]
     fn parses_valid_viewboxes() {
         assert_eq!(
-            ViewBox::parse_str_to_parse_error("  1 2 3 4"),
+            ViewBox::parse_str("  1 2 3 4"),
             Ok(ViewBox(Rect::new(1.0, 2.0, 4.0, 6.0)))
         );
 
         assert_eq!(
-            ViewBox::parse_str_to_parse_error(" -1.5 -2.5e1,34,56e2  "),
+            ViewBox::parse_str(" -1.5 -2.5e1,34,56e2  "),
             Ok(ViewBox(Rect::new(-1.5, -25.0, 32.5, 5575.0)))
         );
     }
 
     #[test]
     fn parsing_invalid_viewboxes_yields_error() {
-        assert!(ViewBox::parse_str_to_parse_error("").is_err());
-        assert!(ViewBox::parse_str_to_parse_error(" 1,2,-3,-4 ").is_err());
-        assert!(ViewBox::parse_str_to_parse_error("qwerasdfzxcv").is_err());
-        assert!(ViewBox::parse_str_to_parse_error(" 1 2 3 4   5").is_err());
-        assert!(ViewBox::parse_str_to_parse_error(" 1 2 foo 3 4").is_err());
+        assert!(ViewBox::parse_str("").is_err());
+        assert!(ViewBox::parse_str(" 1,2,-3,-4 ").is_err());
+        assert!(ViewBox::parse_str("qwerasdfzxcv").is_err());
+        assert!(ViewBox::parse_str(" 1 2 3 4   5").is_err());
+        assert!(ViewBox::parse_str(" 1 2 foo 3 4").is_err());
 
         // https://gitlab.gnome.org/GNOME/librsvg/issues/344
-        assert!(ViewBox::parse_str_to_parse_error("0 0 9E80.7").is_err());
+        assert!(ViewBox::parse_str("0 0 9E80.7").is_err());
     }
 }
diff --git a/rsvg_internals/src/xml.rs b/rsvg_internals/src/xml.rs
index 49cbf7df..c73a47db 100644
--- a/rsvg_internals/src/xml.rs
+++ b/rsvg_internals/src/xml.rs
@@ -4,7 +4,16 @@ use crate::xml_rs::{reader::XmlEvent, ParserConfig};
 use encoding::label::encoding_from_whatwg_label;
 use encoding::DecoderTrap;
 use libc;
-use markup5ever::{expanded_name, local_name, namespace_url, ns, ExpandedName, LocalName, Namespace, 
QualName};
+use markup5ever::{
+    expanded_name,
+    local_name,
+    namespace_url,
+    ns,
+    ExpandedName,
+    LocalName,
+    Namespace,
+    QualName,
+};
 use std::cell::RefCell;
 use std::collections::HashMap;
 use std::rc::{Rc, Weak};
@@ -271,7 +280,10 @@ impl XmlState {
                     .append_stylesheet_from_xml_processing_instruction(alternate, type_, &href)
                     .is_err()
                 {
-                    rsvg_log!("invalid xml-stylesheet {} in XML processing instruction", href);
+                    rsvg_log!(
+                        "invalid xml-stylesheet {} in XML processing instruction",
+                        href
+                    );
                 }
             } else {
                 rsvg_log!("xml-stylesheet processing instruction does not have href; ignoring");
@@ -363,7 +375,8 @@ impl XmlState {
             .unwrap_or(StyleType::TextCss);
 
         if style_type == StyleType::TextCss {
-            let stylesheet_text = current_node.children()
+            let stylesheet_text = current_node
+                .children()
                 .map(|child| {
                     let child_borrow = child.borrow();
 


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