chiark / gitweb /
specs: Change error handling for load_spec_to_read
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 19 May 2021 23:42:46 +0000 (00:42 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 19 May 2021 23:52:10 +0000 (00:52 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
src/bundles.rs

index 3ad736b8e86022a8a9620a45c7f06d406c75882a..02d76f4a113ef0d4fba0ebbc691c003da330eeb3 100644 (file)
@@ -693,14 +693,12 @@ 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, what) = bundles::load_spec_to_read(ig,&spec)?;
+        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()),
-          _ => IE::from(
-            AE::from(e).context(what).context("read spec")
-          ).into()
+          _ => e_f(e),
         })?;
         Ok::<_,ME>(buf)
       }))?
index 30a9b7556f5dfa08f181ce79a48bbb207512c41b..726720e67e7c93ed120c5bd5c1d04a3dcc45d077 100644 (file)
@@ -711,9 +711,10 @@ 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>, String)
-{
+pub fn load_spec_to_read(ig: &Instance, spec_name: &str) -> (
+  Box<dyn Read>,
+  Box<dyn FnOnce(io::Error) -> MgmtError>
+) {
   let spec_leaf = format!("{}.game.toml", spec_name);
 
   // todo: game specs from bundles
@@ -725,7 +726,12 @@ 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 _, 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 _,
+      ),
       Err(e) if e.kind() == ErrorKind::NotFound => { },
       Err(e) => throw!(IE::from(
         AE::from(e).context(path).context("try open game spec")