mod admin; pub mod core; mod icons; mod identity; mod notifications; mod web; use rocket_contrib::json::Json; use serde_json::Value; pub use crate::api::{ admin::routes as admin_routes, core::routes as core_routes, icons::routes as icons_routes, identity::routes as identity_routes, notifications::routes as notifications_routes, notifications::{start_notification_server, Notify, UpdateType}, web::routes as web_routes, }; use crate::util; // Type aliases for API methods results type ApiResult = Result; pub type JsonResult = ApiResult>; pub type EmptyResult = ApiResult<()>; type JsonUpcase = Json>; type JsonUpcaseVec = Json>>; // Common structs representing JSON data received #[derive(Deserialize)] #[allow(non_snake_case)] struct PasswordData { MasterPasswordHash: String, } #[derive(Deserialize, Debug, Clone)] #[serde(untagged)] enum NumberOrString { Number(i32), String(String), } impl NumberOrString { fn into_string(self) -> String { match self { NumberOrString::Number(n) => n.to_string(), NumberOrString::String(s) => s, } } fn into_i32(self) -> ApiResult { use std::num::ParseIntError as PIE; match self { NumberOrString::Number(n) => Ok(n), NumberOrString::String(s) => s .parse() .map_err(|e: PIE| crate::Error::new("Can't convert to number", e.to_string())), } } }