use crate::tree::AttributeMap;
type AttributeValue<'a> = &'a [&'a str];
type AttributeEntry<'a> = (&'a str, AttributeValue<'a>);
#[derive(Debug)]
pub struct AddedAttributes<'a> {
pub entries: &'a [(AttributeEntry<'a>, bool)],
pub map: Option<&'a AttributeMap<'a>>,
}
macro_rules! attr_entry {
($key:expr $(,)?) => {
attr_entry!(=> $key, &[], true)
};
($key:expr, $( $value:expr ),+ ) => {
attr_entry!(=> $key, &[ $( $value ),+ ], true)
};
($key:expr, $( $value:expr ),+ ; $condition:expr) => {
attr_entry!(=> $key, &[ $( $value ),+ ], $condition)
};
($key:expr, ; $condition:expr) => {
attr_entry!(=> $key, &[], $condition)
};
(=> $key:expr, $value:expr, $condition:expr) => {
(($key, $value), $condition)
};
}
macro_rules! attr_map {
($attribute_map:expr) => {
Some(&$attribute_map)
};
() => {
None
};
}
macro_rules! attr {
(
$( $key:expr $( => $( $value:expr )+ )? $( ; if $condition:expr )? ),* $(,)?
$( ;; $attribute_map:expr $(,)? )?
) => {
AddedAttributes {
entries: &[
$(
attr_entry!( $key, $( $( $value ),+ )? $( ; $condition )? )
),*
],
map: attr_map!( $( $attribute_map )? ),
}
};
}
#[test]
fn attr_macro() {
let _ = attr!();
let _ = attr!("key");
let _ = attr!("key" => "value");
let _ = attr!("key" => "value" "parts");
let _ = attr!("key" => "value" "parts" "third");
let _ = attr!("key" => "value" "parts" "third"; if true);
let _ = attr!("key" => "value" "parts" "third"; if true;; AttributeMap::new());
let _ = attr!("key" => "value"; if true);
let _ = attr!("key" => "value"; if true;; AttributeMap::new());
let _ = attr!("key"; if true);
let _ = attr!(
"key1",
"key2"; if true
);
let _ = attr!(
"key1",
"key2"; if true,
);
let _ = attr!(
"key1",
"key2"; if true,
"key3"; if true
);
let _ = attr!(
"key1",
"key2"; if true,
"key3"; if true,
);
let _ = attr!(
"key1",
"key2"; if true,
"key3"; if true;;
AttributeMap::new()
);
let _ = attr!(;; AttributeMap::new());
let _ = attr!("key";; AttributeMap::new());
let _ = attr!("key" => "value";; AttributeMap::new());
let _ = attr!(
"key1" => "value1",
"key2" => "value" "2",
"key3" => "value3"
);
let _ = attr!(
"key1" => "value1",
"key2" => "value" "2",
"key3" => "value3",
);
let _ = attr!(
"key1" => "value1"; if true,
"key2" => "value" "2",
"key3" => "value3"; if false,
);
let _ = attr!(
"key1" => "value1"; if true,
"key2" => "value" "2",
"key3" => "value3"; if false;;
AttributeMap::new()
);
let _ = attr!(
"key1" => "value1"; if true,
"key2" => "value" "2",
"key3" => "value3"; if false;;
AttributeMap::new(),
);
}