From 80c406f19697af9992d2808e50fe927e4865f303 Mon Sep 17 00:00:00 2001 From: Kenneth Loeffler Date: Fri, 8 Nov 2024 08:40:32 +0000 Subject: [PATCH] Fix returning NoProjectFound for any project load error (#985) In #917, we accidentally changed ServeSession::new's project loading logic so that it always returns `ServeSession::ProjectNotFound` if the load fails for any reason. This PR fixes this so that it returns the right error when there is an error loading the project, and moves the `NoProjectFound` error to `project::Error`, since I think it makes more sense there. --- src/project.rs | 28 ++++++++++++++++++++++------ src/serve_session.rs | 18 ++---------------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/project.rs b/src/project.rs index b9573427f..a83088c04 100644 --- a/src/project.rs +++ b/src/project.rs @@ -10,10 +10,7 @@ use memofs::Vfs; use serde::{Deserialize, Serialize}; use thiserror::Error; -use crate::{ - glob::Glob, resolution::UnresolvedValue, snapshot::SyncRule, - snapshot_middleware::default_sync_rules, -}; +use crate::{glob::Glob, resolution::UnresolvedValue, snapshot::SyncRule}; static PROJECT_FILENAME: &str = "default.project.json"; @@ -24,6 +21,13 @@ pub struct ProjectError(#[from] Error); #[derive(Debug, Error)] enum Error { + #[error( + "Rojo requires a project file, but no project file was found in path {}\n\ + See https://rojo.space/docs/ for guides and documentation.", + .path.display() + )] + NoProjectFound { path: PathBuf }, + #[error("The folder for the provided project cannot be used as a project name: {}\n\ Consider setting the `name` field on this project.", .path.display())] FolderNameInvalid { path: PathBuf }, @@ -222,7 +226,13 @@ impl Project { fuzzy_project_location: &Path, ) -> Result, ProjectError> { if let Some(project_path) = Self::locate(fuzzy_project_location) { - let contents = vfs.read(&project_path).map_err(Error::from)?; + let contents = vfs.read(&project_path).map_err(|e| match e.kind() { + io::ErrorKind::NotFound => Error::NoProjectFound { + path: project_path.to_path_buf(), + }, + _ => return e.into(), + })?; + Ok(Some(Self::load_from_slice(&contents, project_path, None)?)) } else { Ok(None) @@ -236,7 +246,13 @@ impl Project { fallback_name: Option<&str>, ) -> Result { let project_path = project_file_location.to_path_buf(); - let contents = vfs.read(&project_path).map_err(Error::from)?; + let contents = vfs.read(&project_path).map_err(|e| match e.kind() { + io::ErrorKind::NotFound => Error::NoProjectFound { + path: project_path.to_path_buf(), + }, + _ => return e.into(), + })?; + Ok(Self::load_from_slice( &contents, project_path, diff --git a/src/serve_session.rs b/src/serve_session.rs index ddb4dc21b..25317d741 100644 --- a/src/serve_session.rs +++ b/src/serve_session.rs @@ -3,7 +3,7 @@ use std::{ collections::HashSet, io, net::IpAddr, - path::{Path, PathBuf}, + path::Path, sync::{Arc, Mutex, MutexGuard}, time::Instant, }; @@ -109,14 +109,7 @@ impl ServeSession { log::debug!("Loading project file from {}", project_path.display()); - let root_project = match Project::load_exact(&vfs, &project_path, None) { - Ok(project) => project, - Err(_) => { - return Err(ServeSessionError::NoProjectFound { - path: project_path.to_path_buf(), - }) - } - }; + let root_project = Project::load_exact(&vfs, &project_path, None)?; let mut tree = RojoTree::new(InstanceSnapshot::new()); @@ -226,13 +219,6 @@ impl ServeSession { #[derive(Debug, Error)] pub enum ServeSessionError { - #[error( - "Rojo requires a project file, but no project file was found in path {}\n\ - See https://rojo.space/docs/ for guides and documentation.", - .path.display() - )] - NoProjectFound { path: PathBuf }, - #[error(transparent)] Io { #[from]