Get rid of duplicate code

Use structure update and default to reduce duplicated
code.

Change-Id: I6076aa0d3c63c83f312e2f954ce1ba017208bb3a
diff --git a/src/lib.rs b/src/lib.rs
index d7b3601..cbee4f6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -279,6 +279,11 @@
     Ermine,
 }
 
+impl Default for RunMode {
+    fn default() -> Self {
+        RunMode::Normal
+    }
+}
 fn run_switches_to_mode(tiles: bool, run: bool, ermine: bool) -> RunMode {
     if tiles {
         RunMode::Tiles
@@ -299,7 +304,7 @@
     format!("fargo-story-{}", secs)
 }
 
-#[derive(Debug)]
+#[derive(Debug, Clone, Default)]
 pub struct RunCargoOptions {
     pub verbose: bool,
     pub release: bool,
@@ -314,115 +319,35 @@
 
 impl RunCargoOptions {
     pub fn new(verbose: bool, release: bool) -> RunCargoOptions {
-        RunCargoOptions {
-            verbose,
-            release,
-            nocapture: false,
-            run_mode: RunMode::Normal,
-            story_name: None,
-            mod_name: None,
-            disable_cross: false,
-            manifest_path: None,
-            cmx_path: None,
-        }
+        Self { verbose, release, ..Self::default() }
     }
 
     pub fn disable_cross(&self, disable_cross: bool) -> RunCargoOptions {
-        RunCargoOptions {
-            verbose: self.verbose,
-            release: self.release,
-            nocapture: self.nocapture,
-            run_mode: self.run_mode,
-            story_name: self.story_name.clone(),
-            mod_name: self.mod_name.clone(),
-            disable_cross,
-            manifest_path: self.manifest_path.clone(),
-            cmx_path: self.cmx_path.clone(),
-        }
+        Self { disable_cross, ..self.clone() }
     }
 
     pub fn release(&self, release: bool) -> RunCargoOptions {
-        RunCargoOptions {
-            verbose: self.verbose,
-            release: release,
-            nocapture: self.nocapture,
-            run_mode: self.run_mode,
-            story_name: self.story_name.clone(),
-            mod_name: self.mod_name.clone(),
-            disable_cross: self.disable_cross,
-            manifest_path: self.manifest_path.clone(),
-            cmx_path: self.cmx_path.clone(),
-        }
+        Self { release, ..self.clone() }
     }
 
     pub fn nocapture(&self, nocapture: bool) -> RunCargoOptions {
-        RunCargoOptions {
-            verbose: self.verbose,
-            release: self.release,
-            nocapture: nocapture,
-            run_mode: self.run_mode,
-            story_name: self.story_name.clone(),
-            mod_name: self.mod_name.clone(),
-            disable_cross: self.disable_cross,
-            manifest_path: self.manifest_path.clone(),
-            cmx_path: self.cmx_path.clone(),
-        }
+        Self { nocapture, ..self.clone() }
     }
 
     pub fn run_mode(&self, run_mode: RunMode) -> RunCargoOptions {
-        RunCargoOptions {
-            verbose: self.verbose,
-            release: self.release,
-            nocapture: self.nocapture,
-            run_mode: run_mode,
-            story_name: self.story_name.clone(),
-            mod_name: self.mod_name.clone(),
-            disable_cross: self.disable_cross,
-            manifest_path: self.manifest_path.clone(),
-            cmx_path: self.cmx_path.clone(),
-        }
+        Self { run_mode, ..self.clone() }
     }
 
     pub fn story_name(&self, story_name: &Option<&str>) -> RunCargoOptions {
-        RunCargoOptions {
-            verbose: self.verbose,
-            release: self.release,
-            nocapture: self.nocapture,
-            run_mode: self.run_mode,
-            story_name: story_name.map(|name| name.to_string()),
-            mod_name: self.mod_name.clone(),
-            disable_cross: self.disable_cross,
-            manifest_path: self.manifest_path.clone(),
-            cmx_path: self.cmx_path.clone(),
-        }
+        Self { story_name: story_name.map(|name| name.to_string()), ..self.clone() }
     }
 
     pub fn mod_name(&self, mod_name: &Option<&str>) -> RunCargoOptions {
-        RunCargoOptions {
-            verbose: self.verbose,
-            release: self.release,
-            nocapture: self.nocapture,
-            run_mode: self.run_mode,
-            story_name: self.story_name.clone(),
-            mod_name: mod_name.map(|name| name.to_string()),
-            disable_cross: self.disable_cross,
-            manifest_path: self.manifest_path.clone(),
-            cmx_path: self.cmx_path.clone(),
-        }
+        Self { mod_name: mod_name.map(|name| name.to_string()), ..self.clone() }
     }
 
     pub fn manifest_path(&self, manifest_path: Option<PathBuf>) -> RunCargoOptions {
-        RunCargoOptions {
-            verbose: self.verbose,
-            release: self.release,
-            nocapture: self.nocapture,
-            run_mode: self.run_mode,
-            story_name: self.story_name.clone(),
-            mod_name: self.mod_name.clone(),
-            disable_cross: self.disable_cross,
-            manifest_path: manifest_path,
-            cmx_path: self.cmx_path.clone(),
-        }
+        Self { manifest_path, ..self.clone() }
     }
 
     pub fn get_story_name(&self) -> String {
@@ -1165,14 +1090,8 @@
 
     let run_cargo_options = RunCargoOptions {
         verbose,
-        release: false,
-        nocapture: false,
-        run_mode: RunMode::Normal,
-        story_name: None,
-        mod_name: None,
-        disable_cross,
-        manifest_path: None,
         cmx_path: matches.value_of(CMX_PATH).map(|s| PathBuf::from(s)),
+        ..RunCargoOptions::default()
     };
 
     if verbose {