Clean up dynamic option checks
authorYehuda Katz <wycats@gmail.com>
Thu, 20 Mar 2014 20:05:52 +0000 (13:05 -0700)
committerYehuda Katz <wycats@gmail.com>
Thu, 20 Mar 2014 20:05:52 +0000 (13:05 -0700)
src/bin/cargo-read-manifest.rs

index 5e99cf56f73c2bfddbe8e9075e857cac6bfc8569..17487f48a98a62546547b269bcbab34e4d26a09c 100644 (file)
@@ -81,43 +81,31 @@ fn execute() -> CargoResult<()> {
 }
 
 fn normalize(lib: &Option<~[SerializedLibTarget]>, bin: &Option<~[SerializedExecTarget]>) -> (~[LibTarget], ~[ExecTarget]) {
-    if lib.is_some() && bin.is_some() {
-        let l = lib.clone().unwrap()[0];
-        let mut path = l.path.clone();
+    fn lib_targets(libs: &[SerializedLibTarget]) -> ~[LibTarget] {
+        let l = &lib[0];
+        let path = l.path.clone().unwrap_or_else(|| format!("src/{}.rs", l.name));
+        ~[LibTarget{ path: path, name: l.name.clone() }]
+    }
 
-        if path.is_none() {
-            path = Some(format!("src/{}.rs", l.name));
-        }
+    fn bin_targets(bins: &[SerializedExecTarget], default: |&SerializedExecTarget| -> ~str) -> ~[ExecTarget] {
+        bins.map(|bin| {
+            let path = bin.path.clone().unwrap_or_else(|| default(bin));
+            ExecTarget{ path: path, name: bin.name.clone() }
+        })
+    }
 
-        let b = bin.get_ref().map(|b_ref| {
-            let b = b_ref.clone();
-            let mut path = b.path.clone();
-            if path.is_none() {
-                path = Some(format!("src/bin/{}.rs", b.name.clone()));
-            }
-            ExecTarget{ path: path.unwrap(), name: b.name }
-        });
-        (~[LibTarget{ path: path.unwrap(), name: l.name }], b)
-    } else if lib.is_some() {
-        let l = lib.clone().unwrap()[0];
-        let mut path = l.path.clone();
-
-        if path.is_none() {
-            path = Some(format!("src/{}.rs", l.name));
+    match (lib, bin) {
+        (&Some(ref libs), &Some(ref bins)) => {
+            (lib_targets(libs.as_slice()), bin_targets(bins.as_slice(), |bin| format!("src/bin/{}.rs", bin.name)))
+        },
+        (&Some(ref libs), &None) => {
+            (lib_targets(libs.as_slice()), ~[])
+        },
+        (&None, &Some(ref bins)) => {
+            (~[], bin_targets(bins.as_slice(), |bin| format!("src/{}.rs", bin.name)))
+        },
+        (&None, &None) => {
+            (~[], ~[])
         }
-
-        (~[LibTarget{ path: path.unwrap(), name: l.name }], ~[])
-    } else if bin.is_some() {
-        let b = bin.get_ref().map(|b_ref| {
-            let b = b_ref.clone();
-            let mut path = b.path.clone();
-            if path.is_none() {
-                path = Some(format!("src/{}.rs", b.name.clone()));
-            }
-            ExecTarget{ path: path.unwrap(), name: b.name }
-        });
-        (~[], b)
-    } else {
-        (~[], ~[])
     }
 }