proxmox-backup/src/api_info.rs

71 lines
1.6 KiB
Rust
Raw Normal View History

2018-10-31 09:42:14 +00:00
use failure::*;
use crate::json_schema::*;
2018-11-01 12:05:45 +00:00
use serde_json::{Value};
2018-10-31 09:42:14 +00:00
2018-11-01 14:41:08 +00:00
#[derive(Debug)]
2018-11-01 13:16:41 +00:00
pub struct ApiMethod<'a> {
pub description: &'a str,
pub properties: &'a PropertyMap<'a>,
pub returns: &'a Jss<'a>,
2018-10-31 09:42:14 +00:00
pub handler: fn(Value) -> Result<Value, Error>,
}
2018-11-01 13:16:41 +00:00
pub type SubdirMap<'a> = crate::static_map::StaticMap<'a, &'a str, &'a MethodInfo<'a>>;
2018-10-31 09:42:14 +00:00
2018-11-01 14:41:08 +00:00
#[macro_export]
macro_rules! subdirmap {
($($name:ident => $e:expr),*) => {{
SubdirMap {
entries: &[
$( ( stringify!($name), $e), )*
]
}
}}
}
2018-11-01 14:41:08 +00:00
#[derive(Debug)]
2018-11-01 13:16:41 +00:00
pub struct MethodInfo<'a> {
pub get: Option<&'a ApiMethod<'a>>,
pub put: Option<&'a ApiMethod<'a>>,
pub post: Option<&'a ApiMethod<'a>>,
pub delete: Option<&'a ApiMethod<'a>>,
pub subdirs: Option<&'a SubdirMap<'a>>,
2018-10-31 09:42:14 +00:00
}
impl<'a> MethodInfo<'a> {
pub fn find_method(&'a self, components: &[&str]) -> Option<&'a MethodInfo<'a>> {
if components.len() == 0 { return Some(self); };
let (dir, rest) = (components[0], &components[1..]);
if let Some(ref dirmap) = self.subdirs {
if let Some(info) = dirmap.get(&dir) {
return info.find_method(rest);
}
}
None
}
}
2018-10-31 09:42:14 +00:00
pub static METHOD_INFO_DEFAULTS: MethodInfo = MethodInfo {
get: None,
put: None,
post: None,
delete: None,
subdirs: None,
};
2018-11-01 10:30:49 +00:00
#[macro_export]
macro_rules! methodinfo {
($name:ident, $($option:ident => $e:expr),*) => {
static $name: MethodInfo = MethodInfo {
$( $option: Some($e), )*
..METHOD_INFO_DEFAULTS
};
}
}