chiark / gitweb /
specs: Change error handling for load_spec_to_read (again)
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 May 2021 00:00:37 +0000 (01:00 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 May 2021 00:00:37 +0000 (01:00 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
src/bundles.rs

index 02d76f4a113ef0d4fba0ebbc691c003da330eeb3..363ab057764516f728f5fcf7124f2b18b7c5940e 100644 (file)
@@ -693,14 +693,8 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
 
     MGI::ResetFromNamedSpec { spec } => {
       reset_game_from_spec(cs,ag,ig,who, Box::new(move |ig| {
-        let (mut spec_f, e_f) = bundles::load_spec_to_read(ig,&spec)?;
-        let mut buf = String::new();
-        spec_f.read_to_string(&mut buf).map_err(|e| match e.kind() {
-          ErrorKind::InvalidData => ME::GameSpecInvalidData,
-          ErrorKind::UnexpectedEof => ME::BadBundle(e.to_string()),
-          _ => e_f(e),
-        })?;
-        Ok::<_,ME>(buf)
+        let data = bundles::load_spec_to_read(ig,&spec)?;
+        Ok::<_,ME>(data)
       }))?
     }
 
index 726720e67e7c93ed120c5bd5c1d04a3dcc45d077..0bca4eab323eb4360bead7dce863a370033cf4cc 100644 (file)
@@ -711,10 +711,19 @@ fn make_usvg(za: &mut IndexedZip, progress_count: &mut usize,
 //---------- specs ----------
 
 #[throws(MgmtError)]
-pub fn load_spec_to_read(ig: &Instance, spec_name: &str) -> (
-  Box<dyn Read>,
-  Box<dyn FnOnce(io::Error) -> MgmtError>
-) {
+pub fn load_spec_to_read(ig: &Instance, spec_name: &str) -> String {
+  #[throws(MgmtError)]
+  fn read_from_read(spec_f: &mut dyn Read,
+                    e_f: &mut dyn FnMut(io::Error) -> MgmtError) -> String {
+    let mut buf = String::new();
+    spec_f.read_to_string(&mut buf).map_err(|e| match e.kind() {
+      ErrorKind::InvalidData => ME::GameSpecInvalidData,
+      ErrorKind::UnexpectedEof => ME::BadBundle(e.to_string()),
+      _ => e_f(e),
+    })?;
+    buf
+  }
+
   let spec_leaf = format!("{}.game.toml", spec_name);
 
   // todo: game specs from bundles
@@ -726,12 +735,13 @@ pub fn load_spec_to_read(ig: &Instance, spec_name: &str) -> (
     debug!("{}: trying to loading builtin spec from {}",
            &ig.name, &path);
     match File::open(&path) {
-      Ok(f) => return (
-        Box::new(f) as _,
-        Box::new(move |e| IE::from(
-          AE::from(e).context(path.clone()).context("read spec")
-        ).into()) as _,
-      ),
+      Ok(mut f) => {
+        return read_from_read(&mut f, &mut |e| {
+          IE::from(
+            AE::from(e).context(path.clone()).context("read spec")
+          ).into()
+        })?;
+      },
       Err(e) if e.kind() == ErrorKind::NotFound => { },
       Err(e) => throw!(IE::from(
         AE::from(e).context(path).context("try open game spec")