proxmox-backup/src/json_schema.rs

189 lines
4.4 KiB
Rust
Raw Normal View History

use crate::static_map::StaticMap;
2018-11-01 12:05:45 +00:00
pub type PropertyMap<'a> = StaticMap<'a, &'a str, &'a Jss<'a>>;
2018-10-31 09:42:14 +00:00
#[derive(Debug)]
2018-11-01 13:16:41 +00:00
pub struct JssBoolean<'a> {
pub description: &'a str,
2018-10-31 09:42:14 +00:00
pub optional: Option<bool>,
pub default: Option<bool>,
}
#[derive(Debug)]
2018-11-01 13:16:41 +00:00
pub struct JssInteger<'a> {
pub description: &'a str,
2018-10-31 09:42:14 +00:00
pub optional: Option<bool>,
pub minimum: Option<usize>,
pub maximum: Option<usize>,
pub default: Option<usize>,
}
#[derive(Debug)]
2018-11-01 13:16:41 +00:00
pub struct JssString<'a> {
pub description: &'a str,
2018-10-31 09:42:14 +00:00
pub optional: Option<bool>,
2018-11-01 13:16:41 +00:00
pub default: Option<&'a str>,
2018-10-31 09:42:14 +00:00
pub min_length: Option<usize>,
pub max_length: Option<usize>,
}
#[derive(Debug)]
2018-11-01 13:16:41 +00:00
pub struct JssArray<'a> {
pub description: &'a str,
2018-10-31 09:42:14 +00:00
pub optional: Option<bool>,
2018-11-01 13:16:41 +00:00
pub items: &'a Jss<'a>,
2018-10-31 09:42:14 +00:00
}
#[derive(Debug)]
2018-11-01 13:16:41 +00:00
pub struct JssObject<'a> {
pub description: &'a str,
2018-10-31 09:42:14 +00:00
pub optional: Option<bool>,
pub additional_properties: Option<bool>,
2018-11-01 13:16:41 +00:00
pub properties: &'a PropertyMap<'a>,
2018-10-31 09:42:14 +00:00
}
#[derive(Debug)]
2018-11-01 13:16:41 +00:00
pub enum Jss<'a> {
2018-10-31 09:42:14 +00:00
Null,
2018-11-01 13:16:41 +00:00
Boolean(JssBoolean<'a>),
Integer(JssInteger<'a>),
String(JssString<'a>),
Object(JssObject<'a>),
Array(JssArray<'a>),
2018-10-31 09:42:14 +00:00
}
pub const DEFAULTBOOL: JssBoolean = JssBoolean {
2018-10-31 09:42:14 +00:00
description: "",
optional: None,
default: None,
};
#[macro_export]
macro_rules! Boolean {
($($name:ident => $e:expr),*) => {{
Jss::Boolean(JssBoolean { $($name: $e, )* ..DEFAULTBOOL})
}}
}
pub const DEFAULTINTEGER: JssInteger = JssInteger {
2018-10-31 09:42:14 +00:00
description: "",
optional: None,
default: None,
minimum: None,
maximum: None,
};
#[macro_export]
macro_rules! Integer {
($($name:ident => $e:expr),*) => {{
Jss::Integer(JssInteger { $($name: $e, )* ..DEFAULTINTEGER})
}}
}
pub const DEFAULTSTRING: JssString = JssString {
2018-10-31 09:42:14 +00:00
description: "",
optional: None,
default: None,
min_length: None,
max_length: None,
};
#[macro_export]
macro_rules! ApiString {
($($name:ident => $e:expr),*) => {{
Jss::String(JssString { $($name: $e, )* ..DEFAULTSTRING})
}}
}
pub const DEFAULTARRAY: JssArray = JssArray {
2018-10-31 09:42:14 +00:00
description: "",
optional: None,
items: &Jss::Null, // is this a reasonable default??
};
#[macro_export]
macro_rules! Array {
($($name:ident => $e:expr),*) => {{
Jss::Array(JssArray { $($name: $e, )* ..DEFAULTARRAY})
}}
}
pub const EMPTYOBJECT: PropertyMap = PropertyMap { entries: &[] };
2018-10-31 09:42:14 +00:00
pub const DEFAULTOBJECT: JssObject = JssObject {
2018-10-31 09:42:14 +00:00
description: "",
optional: None,
additional_properties: None,
properties: &EMPTYOBJECT, // is this a reasonable default??
};
#[macro_export]
macro_rules! Object {
($($name:ident => $e:expr),*) => {{
Jss::Object(JssObject { $($name: $e, )* ..DEFAULTOBJECT})
}}
}
// Standard Option Definitions
pub static PVE_VMID: Jss = Integer!{
description => "The (unique) ID of the VM.",
minimum => Some(1)
};
2018-11-02 08:44:18 +00:00
#[macro_export]
macro_rules! propertymap {
($($name:ident => $e:expr),*) => {
PropertyMap {
entries: &[
$( ( stringify!($name), $e), )*
]
}
}
}
2018-11-03 08:08:01 +00:00
#[test]
fn test_shema1() {
static PARAMETERS1: PropertyMap = propertymap!{
force => &Boolean!{
description => "Test for boolean options."
},
text1 => &ApiString!{
description => "A simple text string.",
min_length => Some(10),
max_length => Some(30)
},
count => &Integer!{
description => "A counter for everything.",
minimum => Some(0),
maximum => Some(10)
},
myarray1 => &Array!{
description => "Test Array of simple integers.",
items => &PVE_VMID
},
myarray2 => &Jss::Array(JssArray {
description: "Test Array of simple integers.",
optional: Some(false),
items: &Object!{description => "Empty Object."},
}),
myobject => &Object!{
description => "TEST Object.",
properties => &propertymap!{
vmid => &PVE_VMID,
loop => &Integer!{
description => "Totally useless thing.",
optional => Some(false)
}
}
},
emptyobject => &Object!{description => "Empty Object."}
};
for (k, v) in PARAMETERS1.entries {
println!("Parameter: {} Value: {:?}", k, v);
}
}