Add cli & lib crates

This commit is contained in:
2021-04-22 15:13:28 +02:00
parent e39cffa3f6
commit 3a9ecc398a
53 changed files with 5065 additions and 99 deletions

88
server/src/status_json.rs Normal file
View File

@ -0,0 +1,88 @@
#![allow(dead_code)]
use duplicate::duplicate;
use log::{info, warn};
use rocket::http::Status;
use rocket::response::{Responder, Response};
use rocket::Request;
use rocket_contrib::json;
use rocket_contrib::json::Json; // macro
/// An error message which can be serialized as JSON.
///
/// #### Example JSON
/// ```json
/// {
/// "status": 404,
/// "description": "Not Found"
/// }
/// ```
#[derive(Debug, Clone)]
pub struct StatusJson {
pub status: Status,
pub description: String,
}
impl StatusJson {
pub fn new<S: ToString>(status: Status, description: S) -> Self {
StatusJson {
status,
description: description.to_string(),
}
}
pub fn describe<S: ToString>(mut self, description: S) -> Self {
self.description = description.to_string();
self
}
}
impl<'r> Responder<'r, 'static> for StatusJson {
fn respond_to(self, req: &Request) -> Result<Response<'static>, Status> {
if self.status.code >= 400 {
warn!(
"Responding with status {}.\n\
Description: {}",
self.status, self.description,
);
} else {
info!("Responding with status {}", self.status);
}
let mut response = Json(json!({
"status": self.status.code,
"description": self.description,
}))
.respond_to(req)?;
response.set_status(self.status);
Ok(response)
}
}
#[duplicate(
status_code T;
[ Status::InternalServerError ] [ sled::Error ];
[ Status::InternalServerError ] [ sled::transaction::TransactionError ];
[ Status::InternalServerError ] [ bincode::Error ];
[ Status::BadRequest ] [ uuid::Error ];
[ Status::BadRequest ] [ chrono::ParseError ];
)]
impl From<T> for StatusJson {
fn from(e: T) -> StatusJson {
StatusJson {
status: status_code,
description: e.to_string(),
}
}
}
impl From<Status> for StatusJson {
fn from(status: Status) -> StatusJson {
StatusJson {
description: status.reason.to_string(),
status,
}
}
}