diff --git a/src/snapshot_middleware/csv.rs b/src/snapshot_middleware/csv.rs index f54e4a51..9dca4747 100644 --- a/src/snapshot_middleware/csv.rs +++ b/src/snapshot_middleware/csv.rs @@ -46,8 +46,8 @@ impl SnapshotMiddleware for SnapshotCsv { .relevant_paths(vec![path.to_path_buf(), meta_path.clone()]), ); - if let Some(meta_contents) = vfs.read(meta_path).with_not_found()? { - let mut metadata = AdjacentMetadata::from_slice(&meta_contents); + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = AdjacentMetadata::from_slice(&meta_contents, &meta_path)?; metadata.apply_all(&mut snapshot); } diff --git a/src/snapshot_middleware/dir.rs b/src/snapshot_middleware/dir.rs index 9ff6d9a3..8e9bb932 100644 --- a/src/snapshot_middleware/dir.rs +++ b/src/snapshot_middleware/dir.rs @@ -73,8 +73,8 @@ impl SnapshotMiddleware for SnapshotDir { .context(context), ); - if let Some(meta_contents) = vfs.read(meta_path).with_not_found()? { - let mut metadata = DirectoryMetadata::from_slice(&meta_contents); + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = DirectoryMetadata::from_slice(&meta_contents, &meta_path)?; metadata.apply_all(&mut snapshot); } diff --git a/src/snapshot_middleware/error.rs b/src/snapshot_middleware/error.rs index fc2ef0ed..1460936f 100644 --- a/src/snapshot_middleware/error.rs +++ b/src/snapshot_middleware/error.rs @@ -63,6 +63,13 @@ impl SnapshotError { path: Some(path.into()), } } + + pub(crate) fn malformed_meta_json(source: serde_json::Error, path: impl Into) -> Self { + Self { + detail: SnapshotErrorDetail::MalformedMetaJson { source }, + path: Some(path.into()), + } + } } impl Error for SnapshotError { @@ -114,6 +121,9 @@ pub enum SnapshotErrorDetail { #[snafu(display("malformed .model.json file"))] MalformedModelJson { source: serde_json::Error }, + + #[snafu(display("malformed .meta.json file"))] + MalformedMetaJson { source: serde_json::Error }, } impl From for SnapshotErrorDetail { diff --git a/src/snapshot_middleware/lua.rs b/src/snapshot_middleware/lua.rs index decd6144..abf98973 100644 --- a/src/snapshot_middleware/lua.rs +++ b/src/snapshot_middleware/lua.rs @@ -87,8 +87,8 @@ fn snapshot_lua_file(context: &InstanceContext, vfs: &Vfs, path: &Path) -> Snaps .context(context), ); - if let Some(meta_contents) = vfs.read(meta_path).with_not_found()? { - let mut metadata = AdjacentMetadata::from_slice(&meta_contents); + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = AdjacentMetadata::from_slice(&meta_contents, &meta_path)?; metadata.apply_all(&mut snapshot); } diff --git a/src/snapshot_middleware/meta_file.rs b/src/snapshot_middleware/meta_file.rs index db8e1b40..57f1e318 100644 --- a/src/snapshot_middleware/meta_file.rs +++ b/src/snapshot_middleware/meta_file.rs @@ -1,4 +1,4 @@ -use std::{borrow::Cow, collections::HashMap}; +use std::{borrow::Cow, collections::HashMap, path::Path}; use rbx_dom_weak::UnresolvedRbxValue; use rbx_reflection::try_resolve_value; @@ -6,6 +6,8 @@ use serde::{Deserialize, Serialize}; use crate::snapshot::InstanceSnapshot; +use super::error::SnapshotError; + /// Represents metadata in a sibling file with the same basename. /// /// As an example, hello.meta.json next to hello.lua would allow assigning @@ -21,10 +23,9 @@ pub struct AdjacentMetadata { } impl AdjacentMetadata { - pub fn from_slice(slice: &[u8]) -> Self { + pub fn from_slice(slice: &[u8], path: &Path) -> Result { serde_json::from_slice(slice) - // TODO: Turn into error type - .expect(".meta.json file was malformed") + .map_err(|source| SnapshotError::malformed_meta_json(source, path)) } pub fn apply_ignore_unknown_instances(&mut self, snapshot: &mut InstanceSnapshot) { @@ -74,10 +75,9 @@ pub struct DirectoryMetadata { } impl DirectoryMetadata { - pub fn from_slice(slice: &[u8]) -> Self { + pub fn from_slice(slice: &[u8], path: &Path) -> Result { serde_json::from_slice(slice) - // TODO: Turn into error type - .expect("init.meta.json file was malformed") + .map_err(|source| SnapshotError::malformed_meta_json(source, path)) } pub fn apply_all(&mut self, snapshot: &mut InstanceSnapshot) { diff --git a/src/snapshot_middleware/txt.rs b/src/snapshot_middleware/txt.rs index 41502d55..6e4fcc0c 100644 --- a/src/snapshot_middleware/txt.rs +++ b/src/snapshot_middleware/txt.rs @@ -52,8 +52,8 @@ impl SnapshotMiddleware for SnapshotTxt { .context(context), ); - if let Some(meta_contents) = vfs.read(meta_path).with_not_found()? { - let mut metadata = AdjacentMetadata::from_slice(&meta_contents); + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = AdjacentMetadata::from_slice(&meta_contents, &meta_path)?; metadata.apply_all(&mut snapshot); }