#[macro_export]
macro_rules! schema {
(
$(top: $top:expr,)?
nodes: { $($nodes:tt)* }
$(, marks: { $($marks:tt)* })?
$(,)?
) => {{
#[allow(unused_mut)]
let mut __builder = $crate::SchemaBuilder::new();
$( __builder = __builder.top_node($top); )?
__builder = $crate::schema!(@nodes __builder, $($nodes)*);
$( __builder = $crate::schema!(@marks __builder, $($marks)*); )?
__builder.build()
}};
(@nodes $b:expr,) => { $b };
(@nodes $b:expr, $name:ident { $($fields:tt)* } $(, $($rest:tt)*)?) => {{
#[allow(unused_mut)]
let mut __spec = $crate::NodeSpec::default();
$crate::schema!(@node_fields __spec, $($fields)*);
let __b = $b.node(stringify!($name), __spec);
$crate::schema!(@nodes __b, $($($rest)*)?)
}};
(@node_fields $s:ident,) => {};
(@node_fields $s:ident, content: $v:expr $(, $($r:tt)*)?) => {
$s.content = ::core::option::Option::Some($v.into());
$crate::schema!(@node_fields $s, $($($r)*)?);
};
(@node_fields $s:ident, group: $v:expr $(, $($r:tt)*)?) => {
$s.group = ::core::option::Option::Some($v.into());
$crate::schema!(@node_fields $s, $($($r)*)?);
};
(@node_fields $s:ident, marks: $v:expr $(, $($r:tt)*)?) => {
$s.marks = ::core::option::Option::Some($v.into());
$crate::schema!(@node_fields $s, $($($r)*)?);
};
(@node_fields $s:ident, inline: $v:expr $(, $($r:tt)*)?) => {
$s.inline = $v;
$crate::schema!(@node_fields $s, $($($r)*)?);
};
(@node_fields $s:ident, atom: $v:expr $(, $($r:tt)*)?) => {
$s.atom = $v;
$crate::schema!(@node_fields $s, $($($r)*)?);
};
(@node_fields $s:ident, dom: $v:expr $(, $($r:tt)*)?) => {
$s.to_dom = ::core::option::Option::Some(|_| $crate::DomSpec::element($v));
$crate::schema!(@node_fields $s, $($($r)*)?);
};
(@node_fields $s:ident, to_dom: $v:expr $(, $($r:tt)*)?) => {
$s.to_dom = ::core::option::Option::Some($v);
$crate::schema!(@node_fields $s, $($($r)*)?);
};
(@node_fields $s:ident, parse: [ $($t:expr),* $(,)? ] $(, $($r:tt)*)?) => {
$s.parse_dom = ::std::vec![ $( $crate::ParseRule::tag($t) ),* ];
$crate::schema!(@node_fields $s, $($($r)*)?);
};
(@node_fields $s:ident, attrs: { $($an:ident: $ad:expr),* $(,)? } $(, $($r:tt)*)?) => {
$(
$s.attrs.insert(
::std::string::String::from(stringify!($an)),
$crate::AttrSpec { default: ::core::option::Option::Some($crate::AttrValue::from($ad)) },
);
)*
$crate::schema!(@node_fields $s, $($($r)*)?);
};
(@marks $b:expr,) => { $b };
(@marks $b:expr, $name:ident { $($fields:tt)* } $(, $($rest:tt)*)?) => {{
#[allow(unused_mut)]
let mut __spec = $crate::MarkSpec::default();
$crate::schema!(@mark_fields __spec, $($fields)*);
let __b = $b.mark(stringify!($name), __spec);
$crate::schema!(@marks __b, $($($rest)*)?)
}};
(@mark_fields $s:ident,) => {};
(@mark_fields $s:ident, group: $v:expr $(, $($r:tt)*)?) => {
$s.group = ::core::option::Option::Some($v.into());
$crate::schema!(@mark_fields $s, $($($r)*)?);
};
(@mark_fields $s:ident, inclusive: $v:expr $(, $($r:tt)*)?) => {
$s.inclusive = $v;
$crate::schema!(@mark_fields $s, $($($r)*)?);
};
(@mark_fields $s:ident, dom: $v:expr $(, $($r:tt)*)?) => {
$s.to_dom = ::core::option::Option::Some(|_| $crate::DomSpec::element($v));
$crate::schema!(@mark_fields $s, $($($r)*)?);
};
(@mark_fields $s:ident, to_dom: $v:expr $(, $($r:tt)*)?) => {
$s.to_dom = ::core::option::Option::Some($v);
$crate::schema!(@mark_fields $s, $($($r)*)?);
};
(@mark_fields $s:ident, parse: [ $($t:expr),* $(,)? ] $(, $($r:tt)*)?) => {
$s.parse_dom = ::std::vec![ $( $crate::ParseRule::tag($t) ),* ];
$crate::schema!(@mark_fields $s, $($($r)*)?);
};
(@mark_fields $s:ident, attrs: { $($an:ident: $ad:expr),* $(,)? } $(, $($r:tt)*)?) => {
$(
$s.attrs.insert(
::std::string::String::from(stringify!($an)),
$crate::AttrSpec { default: ::core::option::Option::Some($crate::AttrValue::from($ad)) },
);
)*
$crate::schema!(@mark_fields $s, $($($r)*)?);
};
}