diff --git a/src/web/api.rs b/src/web/api.rs index 83f4be56..99a87675 100644 --- a/src/web/api.rs +++ b/src/web/api.rs @@ -13,7 +13,7 @@ use crate::{ serve_session::ServeSession, web::{ interface::{ - Instance, NotFoundError, ReadResponse, ServerInfoResponse, SubscribeResponse, + ErrorResponse, Instance, ReadResponse, ServerInfoResponse, SubscribeResponse, PROTOCOL_VERSION, SERVER_VERSION, }, util::{json, json_ok}, @@ -38,7 +38,12 @@ impl Service for ApiService { (&Method::GET, path) if path.starts_with("/api/subscribe/") => { self.handle_api_subscribe(request) } - _ => json(NotFoundError, StatusCode::NOT_FOUND), + (_method, path) => { + return json( + ErrorResponse::not_found(format!("Route not found: {}", path)), + StatusCode::NOT_FOUND, + ) + } } } } diff --git a/src/web/interface.rs b/src/web/interface.rs index 7fb0ac26..73d53b6b 100644 --- a/src/web/interface.rs +++ b/src/web/interface.rs @@ -78,5 +78,24 @@ pub struct SubscribeResponse { pub messages: Vec, } +/// General response type returned from all Rojo routes #[derive(Debug, Serialize, Deserialize)] -pub struct NotFoundError; +#[serde(rename_all = "camelCase")] +pub struct ErrorResponse { + kind: ErrorResponseKind, + details: String, +} + +impl ErrorResponse { + pub fn not_found>(details: S) -> Self { + Self { + kind: ErrorResponseKind::NotFound, + details: details.into(), + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum ErrorResponseKind { + NotFound, +} diff --git a/src/web/ui.rs b/src/web/ui.rs index 9d66efa1..3d9093e4 100644 --- a/src/web/ui.rs +++ b/src/web/ui.rs @@ -10,7 +10,7 @@ use crate::{ imfs::new::ImfsFetcher, serve_session::ServeSession, web::{ - interface::{NotFoundError, SERVER_VERSION}, + interface::{ErrorResponse, SERVER_VERSION}, util::json, }, }; @@ -33,7 +33,12 @@ impl Service for UiService { (&Method::GET, "/") => self.handle_home(), (&Method::GET, "/visualize/rbx") => self.handle_visualize_rbx(), (&Method::GET, "/visualize/imfs") => self.handle_visualize_imfs(), - _ => return json(NotFoundError, StatusCode::NOT_FOUND), + (_method, path) => { + return json( + ErrorResponse::not_found(format!("Route not found: {}", path)), + StatusCode::NOT_FOUND, + ) + } }; Box::new(future::ok(response))