new subdirmap macro, cleanups

This commit is contained in:
Dietmar Maurer 2018-11-01 15:41:08 +01:00
parent 763220cefa
commit bfcba4fd86
3 changed files with 34 additions and 10 deletions

View File

@ -3,6 +3,7 @@ use failure::*;
use crate::json_schema::*; use crate::json_schema::*;
use serde_json::{Value}; use serde_json::{Value};
#[derive(Debug)]
pub struct ApiMethod<'a> { pub struct ApiMethod<'a> {
pub description: &'a str, pub description: &'a str,
pub properties: &'a PropertyMap<'a>, pub properties: &'a PropertyMap<'a>,
@ -12,6 +13,17 @@ pub struct ApiMethod<'a> {
pub type SubdirMap<'a> = crate::static_map::StaticMap<'a, &'a str, &'a MethodInfo<'a>>; pub type SubdirMap<'a> = crate::static_map::StaticMap<'a, &'a str, &'a MethodInfo<'a>>;
#[macro_export]
macro_rules! subdirmap {
($($name:ident => $e:expr),*) => {{
SubdirMap {
entries: &[
$( ( stringify!($name), $e), )*
]
}
}}
}
#[derive(Debug)]
pub struct MethodInfo<'a> { pub struct MethodInfo<'a> {
pub get: Option<&'a ApiMethod<'a>>, pub get: Option<&'a ApiMethod<'a>>,
pub put: Option<&'a ApiMethod<'a>>, pub put: Option<&'a ApiMethod<'a>>,

View File

@ -1,6 +1,6 @@
use crate::static_map::StaticMap; use crate::static_map::StaticMap;
pub type PropertyMap<'a> = StaticMap<'a, &'a str, Jss<'a>>; pub type PropertyMap<'a> = StaticMap<'a, &'a str, Jss<'a>>;
#[derive(Debug)] #[derive(Debug)]
pub struct JssBoolean<'a> { pub struct JssBoolean<'a> {
@ -131,4 +131,3 @@ pub static PVE_VMID: Jss = Integer!{
description => "The (unique) ID of the VM.", description => "The (unique) ID of the VM.",
minimum => Some(1) minimum => Some(1)
}; };

View File

@ -45,7 +45,7 @@ static PARAMETERS1: PropertyMap = PropertyMap {
("myobject", Object!{ ("myobject", Object!{
description => "TEST Object.", description => "TEST Object.",
properties => &PropertyMap { properties => &PropertyMap {
entries: &[ entries: &[
("vmid", Jss::Reference { reference: &PVE_VMID}), ("vmid", Jss::Reference { reference: &PVE_VMID}),
("loop", Integer!{ ("loop", Integer!{
description => "Totally useless thing.", description => "Totally useless thing.",
@ -74,7 +74,7 @@ fn test_api_handler(param: Value) -> Result<Value, Error> {
//} //}
let _force = param["force"].as_bool() let _force = param["force"].as_bool()
.ok_or_else(|| format_err!("meine fehlermeldung"))?; .ok_or_else(|| format_err!("missing parameter 'force'"))?;
if let Some(_force) = param["force"].as_bool() { if let Some(_force) = param["force"].as_bool() {
} }
@ -100,6 +100,10 @@ static TEST_API_METHOD: ApiMethod = ApiMethod {
}; };
static API3_TEST: MethodInfo = MethodInfo {
..METHOD_INFO_DEFAULTS
};
static API3_NODES: MethodInfo = MethodInfo { static API3_NODES: MethodInfo = MethodInfo {
get: Some(&TEST_API_METHOD), get: Some(&TEST_API_METHOD),
..METHOD_INFO_DEFAULTS ..METHOD_INFO_DEFAULTS
@ -107,10 +111,9 @@ static API3_NODES: MethodInfo = MethodInfo {
static API_ROOT: MethodInfo = MethodInfo { static API_ROOT: MethodInfo = MethodInfo {
get: Some(&TEST_API_METHOD), get: Some(&TEST_API_METHOD),
subdirs: Some(&SubdirMap { subdirs: Some(&subdirmap!{
entries: &[ test => &API3_TEST,
("nodes", &API3_NODES), nodes => &API3_NODES
]
}), }),
..METHOD_INFO_DEFAULTS ..METHOD_INFO_DEFAULTS
}; };
@ -166,7 +169,7 @@ fn handle_request(req: Request<Body>) -> Response<Body> {
&Method::DELETE => info.delete, &Method::DELETE => info.delete,
_ => None, _ => None,
}; };
let _api_method = match api_method_opt { let api_method = match api_method_opt {
Some(m) => m, Some(m) => m,
_ => http_error!(NOT_FOUND, format!("No such method '{} {}'\n", method, path)), _ => http_error!(NOT_FOUND, format!("No such method '{} {}'\n", method, path)),
}; };
@ -174,11 +177,21 @@ fn handle_request(req: Request<Body>) -> Response<Body> {
// handle auth // handle auth
// extract param // extract param
let _param = match query { let param = match query {
Some(data) => parse_query(data), Some(data) => parse_query(data),
None => json!({}), None => json!({}),
}; };
match (api_method.handler)(param) {
Ok(res) => {
let json_str = res.to_string();
return Response::new(Body::from(json_str));
}
Err(err) => {
http_error!(NOT_FOUND, format!("Method returned error '{}'\n", err));
}
}
} else { } else {
http_error!(NOT_FOUND, format!("No such path '{}'\n", path)); http_error!(NOT_FOUND, format!("No such path '{}'\n", path));
} }