[librsvg: 15/22] Make get_node_from_type() return a Result, not an Option



commit 8a90d6cdc9f5aa3322db2447a936a73ae4a8ec92
Author: Federico Mena Quintero <federico gnome org>
Date:   Wed Oct 2 09:11:00 2019 -0500

    Make get_node_from_type() return a Result, not an Option

 rsvg_internals/src/drawing_ctx.rs | 19 +++++++++----------
 rsvg_internals/src/marker.rs      |  2 +-
 rsvg_internals/src/pattern.rs     | 38 +++++++++++++++++++++-----------------
 3 files changed, 31 insertions(+), 28 deletions(-)
---
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 08cb19b6..69574cad 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -11,7 +11,7 @@ use crate::bbox::BoundingBox;
 use crate::clip_path::{ClipPathUnits, NodeClipPath};
 use crate::coord_units::CoordUnits;
 use crate::dpi::Dpi;
-use crate::error::RenderingError;
+use crate::error::{AcquireError, RenderingError};
 use crate::filters;
 use crate::gradient::{NodeLinearGradient, NodeRadialGradient};
 use crate::length::Dasharray;
@@ -341,7 +341,7 @@ impl DrawingCtx {
     ) -> (Option<RsvgNode>, Option<RsvgNode>) {
         clip_uri
             .and_then(|fragment| {
-                self.acquired_nodes.get_node_of_type(fragment, NodeType::ClipPath)
+                self.acquired_nodes.get_node_of_type(fragment, NodeType::ClipPath).ok()
             })
             .and_then(|acquired| {
                 let clip_node = acquired.get().clone();
@@ -470,7 +470,7 @@ impl DrawingCtx {
                     // Mask
 
                     if let Some(fragment) = mask {
-                        if let Some(acquired) = dc
+                        if let Ok(acquired) = dc
                             .acquired_nodes
                             .get_node_of_type(fragment, NodeType::Mask)
                         {
@@ -553,7 +553,7 @@ impl DrawingCtx {
             .acquired_nodes
             .get_node_of_type(filter_uri, NodeType::Filter)
         {
-            Some(acquired) => {
+            Ok(acquired) => {
                 let filter_node = acquired.get();
 
                 if !filter_node.borrow().is_in_error() {
@@ -564,7 +564,7 @@ impl DrawingCtx {
                 }
             }
 
-            None => {
+            Err(_) => {
                 rsvg_log!(
                     "element {} will not be rendered since its filter \"{}\" was not found",
                     node,
@@ -1117,19 +1117,18 @@ impl AcquiredNodes {
     // Note that if you acquire a node, you have to release it before trying to
     // acquire it again.  If you acquire a node "#foo" and don't release it before
     // trying to acquire "foo" again, you will obtain a None the second time.
-
-    // FIXME: return a Result<AcquiredNode, RenderingError::InvalidReference>
     pub fn get_node_of_type(
         &self,
         fragment: &Fragment,
         node_type: NodeType,
-    ) -> Option<AcquiredNode> {
+    ) -> Result<AcquiredNode, AcquireError> {
         self.get_node(fragment)
+            .ok_or_else(|| AcquireError::LinkNotFound(fragment.clone()))
             .and_then(|acquired| {
                 if acquired.get().borrow().get_type() == node_type {
-                    Some(acquired)
+                    Ok(acquired)
                 } else {
-                    None
+                    Err(AcquireError::InvalidLinkType(fragment.clone()))
                 }
             })
     }
diff --git a/rsvg_internals/src/marker.rs b/rsvg_internals/src/marker.rs
index 3418234b..18c9c70b 100644
--- a/rsvg_internals/src/marker.rs
+++ b/rsvg_internals/src/marker.rs
@@ -588,7 +588,7 @@ fn emit_marker_by_name(
     line_width: f64,
     clipping: bool,
 ) -> Result<BoundingBox, RenderingError> {
-    if let Some(acquired) = draw_ctx
+    if let Ok(acquired) = draw_ctx
         .acquired_nodes()
         .get_node_of_type(name, NodeType::Marker)
     {
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index 80184847..e1ec12bb 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -170,29 +170,33 @@ impl PaintSource for NodePattern {
 
         while !pattern.is_resolved() {
             if let Some(ref fragment) = fallback {
-                if let Some(acquired) = draw_ctx
-                    .acquired_nodes()
-                    .get_node_of_type(&fragment, NodeType::Pattern)
-                {
-                    let acquired_node = acquired.get();
-
-                    if stack.contains(acquired_node) {
-                        return Err(AcquireError::CircularReference(fragment.clone()));
-                    }
+                match draw_ctx.acquired_nodes().get_node_of_type(&fragment, NodeType::Pattern) {
+                    Ok(acquired) => {
+                        let acquired_node = acquired.get();
+
+                        if stack.contains(acquired_node) {
+                            return Err(AcquireError::CircularReference(fragment.clone()));
+                        }
 
-                    let borrowed_node = acquired_node.borrow();
-                    let borrowed_pattern = borrowed_node.get_impl::<NodePattern>();
-                    let unresolved = borrowed_pattern.get_unresolved(&acquired_node);
+                        let borrowed_node = acquired_node.borrow();
+                        let borrowed_pattern = borrowed_node.get_impl::<NodePattern>();
+                        let unresolved = borrowed_pattern.get_unresolved(&acquired_node);
 
-                    pattern = pattern.resolve_from_fallback(&unresolved.pattern);
-                    fallback = unresolved.fallback;
+                        pattern = pattern.resolve_from_fallback(&unresolved.pattern);
+                        fallback = unresolved.fallback;
 
-                    stack.push(acquired_node);
-                } else {
-                    pattern = pattern.resolve_from_defaults();
+                        stack.push(acquired_node);
+                    }
+
+                    Err(e) => {
+                        rsvg_log!("Stopping pattern resolution: {}", e);
+                        pattern = pattern.resolve_from_defaults();
+                        break;
+                    }
                 }
             } else {
                 pattern = pattern.resolve_from_defaults();
+                break;
             }
         }
 


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