[librsvg] property_bag.rs: Implement parse_or_none(), length_or_none()



commit 691cd35ea83f35c4c7bd460b0a88fb53b364b0ff
Author: Federico Mena Quintero <federico gnome org>
Date:   Tue Mar 21 16:54:30 2017 -0600

    property_bag.rs: Implement parse_or_none(), length_or_none()
    
    And reimplement length_or_default()/parse_or_default() in terms of
    those.
    
    These parse a value from a string, or return None as an Option.

 rust/src/property_bag.rs |   42 ++++++++++++++++++++++++++++++++++--------
 1 files changed, 34 insertions(+), 8 deletions(-)
---
diff --git a/rust/src/property_bag.rs b/rust/src/property_bag.rs
index 60a16ad..4b42b40 100644
--- a/rust/src/property_bag.rs
+++ b/rust/src/property_bag.rs
@@ -27,24 +27,50 @@ pub fn lookup (pbag: *const RsvgPropertyBag, key: &str) -> Option<String> {
     }
 }
 
-pub fn length_or_default (pbag: *const RsvgPropertyBag, key: &'static str, length_dir: LengthDir) -> Result 
<RsvgLength, NodeError> {
+pub fn length_or_none (pbag: *const RsvgPropertyBag, key: &'static str, length_dir: LengthDir) -> Result 
<Option<RsvgLength>, NodeError> {
     let value = lookup (pbag, key);
 
     if let Some (v) = value {
-        RsvgLength::parse (&v, length_dir).map_err (|e| NodeError::attribute_error (key, e))
+        RsvgLength::parse (&v, length_dir).map (|l| Some (l))
+            .map_err (|e| NodeError::attribute_error (key, e))
     } else {
-        Ok (RsvgLength::default ())
+        Ok (None)
     }
 }
 
-pub fn parse_or_default<T> (pbag: *const RsvgPropertyBag, key: &'static str) -> Result <T, NodeError>
+pub fn length_or_default (pbag: *const RsvgPropertyBag, key: &'static str, length_dir: LengthDir) -> Result 
<RsvgLength, NodeError> {
+    let r = length_or_none (pbag, key, length_dir);
+
+    match r {
+        Ok (Some (v)) => Ok (v),
+        Ok (None)     => Ok (RsvgLength::default ()),
+        Err (e)       => Err (e)
+    }
+}
+
+pub fn parse_or_none<T> (pbag: *const RsvgPropertyBag, key: &'static str) -> Result <Option<T>, NodeError>
     where T: Default + FromStr<Err = AttributeError>
 {
     let value = lookup (pbag, key);
 
-    if let Some (v) = value {
-        T::from_str (&v).map_err (|e| NodeError::attribute_error (key, e))
-    } else {
-        Ok (T::default ())
+    match value {
+        Some (v) => {
+            T::from_str (&v).map (|v| Some (v))
+                .map_err (|e| NodeError::attribute_error (key, e))
+        },
+
+        None => Ok (None)
+    }
+}
+
+pub fn parse_or_default<T> (pbag: *const RsvgPropertyBag, key: &'static str) -> Result <T, NodeError>
+    where T: Default + FromStr<Err = AttributeError>
+{
+    let r = parse_or_none::<T> (pbag, key);
+
+    match r {
+        Ok (Some (v)) => Ok (v),
+        Ok (None)     => Ok (T::default ()),
+        Err (e)       => Err (e)
     }
 }


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