use crate::DbConn; use crate::user; use rocket::http::Status; use rocket::response::status::Custom; use rocket_contrib::json::Json; use serde::Serialize; use std::vec::Vec; pub fn routes() -> impl Into> { routes![auth] } #[derive(Serialize)] #[serde(untagged)] enum Response { Error { errors: Vec }, Success(T) } // Some shorthands type JsonResp = Json>; fn success_resp(resp: T) -> Custom> { Custom(Status::Ok, Json(Response::Success(resp))) } fn error_resp(status: Status, errors: Vec) -> Custom> { Custom(status, Json(Response::Error { errors })) } #[derive(Serialize)] struct AuthResult { token: String } #[post("/auth", format = "json", data = "")] fn auth(db: DbConn, new_user: Json) -> Custom> { match user::User::create(&db.0, &new_user) { Ok(_) => success_resp(AuthResult { token: "aaaa".to_string() }), Err(user::UserOpError(e)) => error_resp(Status::InternalServerError, vec![e]) } }