2018-11-01 13:42:27 +00:00
|
|
|
use crate::static_map::StaticMap;
|
2018-11-01 12:05:45 +00:00
|
|
|
|
2018-11-02 08:50:26 +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
|
|
|
}
|
|
|
|
|
2018-11-03 09:50:24 +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})
|
|
|
|
}}
|
|
|
|
}
|
|
|
|
|
2018-11-03 09:50:24 +00:00
|
|
|
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})
|
|
|
|
}}
|
|
|
|
}
|
|
|
|
|
2018-11-03 09:50:24 +00:00
|
|
|
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})
|
|
|
|
}}
|
|
|
|
}
|
|
|
|
|
2018-11-03 09:50:24 +00:00
|
|
|
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})
|
|
|
|
}}
|
|
|
|
}
|
|
|
|
|
2018-11-03 09:50:24 +00:00
|
|
|
pub const EMPTYOBJECT: PropertyMap = PropertyMap { entries: &[] };
|
2018-10-31 09:42:14 +00:00
|
|
|
|
2018-11-03 09:50:24 +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);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|