diff --git a/crates/metassr-build/src/server/manifest.rs b/crates/metassr-build/src/server/manifest.rs index 4d0f3e4..7265151 100644 --- a/crates/metassr-build/src/server/manifest.rs +++ b/crates/metassr-build/src/server/manifest.rs @@ -92,15 +92,18 @@ impl Manifest { pub fn get(&self, route: &str) -> Option<&ManifestEntry> { self.routes.get(route) } -} - -impl + ?Sized> From<&S> for Manifest { - fn from(path: &S) -> Self { - let manifest_filename = "manifest.json"; - let path = PathBuf::from(path).join(manifest_filename); - let content = read_to_string(path).unwrap(); - serde_json::from_str(&content).unwrap() + /// Load manifest from path with proper error handling + pub fn load + ?Sized>(path: &S) -> Result { + let path = PathBuf::from(path).join("manifest.json"); + let content = read_to_string(&path).map_err(|e| { + anyhow!( + "Could not read manifest.json at {:?}: {}. Did you run `metassr build` first?", + path, + e + ) + })?; + serde_json::from_str(&content).map_err(|e| anyhow!("manifest.json is malformed: {}", e)) } } diff --git a/crates/metassr-build/src/server/renderer/page.rs b/crates/metassr-build/src/server/renderer/page.rs index 321f94c..249cb3a 100644 --- a/crates/metassr-build/src/server/renderer/page.rs +++ b/crates/metassr-build/src/server/renderer/page.rs @@ -1,6 +1,6 @@ use std::ffi::OsStr; -use anyhow::Result; +use anyhow::{anyhow, Result}; use metassr_fs_analyzer::dist_dir::PageEntry; use metassr_utils::cache_dir::CacheDir; @@ -23,10 +23,13 @@ impl PageRenderer { manifest_parent: &S, route: &str, ) -> Result { - let manifest = Manifest::from(manifest_parent); + let manifest = Manifest::load(manifest_parent)?; let cache = CacheDir::new(&manifest.global.cache)?; - let entry = manifest.get(route).unwrap().clone(); + let entry = manifest + .get(route) + .ok_or_else(|| anyhow!("No manifest entry found for route: {:?}", route))? + .clone(); let exec = RenderExec::new(entry.id, &entry.renderer)?; let body = exec.exec()?;