Change API errors to be JSON

This commit is contained in:
Lucien Greathouse
2019-09-19 13:20:58 -07:00
parent e773a92e53
commit 44a42a177a
3 changed files with 34 additions and 5 deletions

View File

@@ -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<F: ImfsFetcher> Service for ApiService<F> {
(&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,
)
}
}
}
}

View File

@@ -78,5 +78,24 @@ pub struct SubscribeResponse {
pub messages: Vec<SubscribeMessage>,
}
/// 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<S: Into<String>>(details: S) -> Self {
Self {
kind: ErrorResponseKind::NotFound,
details: details.into(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub enum ErrorResponseKind {
NotFound,
}

View File

@@ -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<F: ImfsFetcher> Service for UiService<F> {
(&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))