#[macro_export]
macro_rules! impl_extension {
() => {
{
mf_core::extension::Extension::new()
}
};
($(attr:$attr:expr),*) => {
{
let mut ext = mf_core::extension::Extension::new();
$(
ext.add_global_attribute($attr);
)*
ext
}
};
($(plugin:$plugin:expr),*) => {
{
let mut ext = mf_core::extension::Extension::new();
$(
ext.add_plugin(std::sync::Arc::new($plugin));
)*
ext
}
};
($(op:$op:expr),*) => {
{
let mut ext = mf_core::extension::Extension::new();
$(
ext.add_op_fn(std::sync::Arc::new($op));
)*
ext
}
};
($(attr:$attr:expr),* ; $(plugin:$plugin:expr),*) => {
{
let mut ext = mf_core::extension::Extension::new();
$(
ext.add_global_attribute($attr);
)*
$(
ext.add_plugin(std::sync::Arc::new($plugin));
)*
ext
}
};
($(attr:$attr:expr),* ; $(plugin:$plugin:expr),* ; $(op:$op:expr),*) => {
{
let mut ext = mf_core::extension::Extension::new();
$(
ext.add_global_attribute($attr);
)*
$(
ext.add_plugin(std::sync::Arc::new($plugin));
)*
$(
ext.add_op_fn(std::sync::Arc::new($op));
)*
ext
}
};
}
#[macro_export]
macro_rules! mf_ops {
($name:ident, [ $( $op:ident ),+ $(,)? ]) => {
pub fn $name() -> mf_core::extension::OpFn {
vec![
$(
std::sync::Arc::new($op),
)+
]
}
};
}
#[macro_export]
macro_rules! mf_extension {
(
$name:ident
$(, ops = [ $( $op:ident ),+ $(,)? ] )?
$(, plugins = [ $( $plugin:expr ),+ $(,)? ] )?
$(, global_attributes = [ $( $attr:expr ),+ $(,)? ] )?
$(, node_transform = $node_transform_fn:expr )?
$(, docs = $docs:expr )?
$(,)?
) => {
$( #[doc = $docs] )?
#[doc = concat!("let extension = ", stringify!($name), "::init();")]
#[allow(non_camel_case_types)]
pub struct $name;
impl $name {
pub fn init() -> mf_core::extension::Extension {
let mut ext = mf_core::extension::Extension::new();
$(
let ops: mf_core::extension::OpFn = vec![
$(
std::sync::Arc::new($op),
)+
];
for op in ops {
ext.add_op_fn(op);
}
)?
$(
$(
ext.add_plugin(std::sync::Arc::new($plugin));
)+
)?
$(
$(
ext.add_global_attribute($attr);
)+
)?
$(
ext.add_node_transform(std::sync::Arc::new($node_transform_fn));
)?
ext
}
}
};
}
#[macro_export]
macro_rules! mf_extension_with_config {
(
$name:ident,
config = { $( $config_field:ident : $config_type:ty ),+ $(,)? },
init_fn = $init_fn:expr
$(, docs = $docs:expr )?
$(,)?
) => {
$( #[doc = $docs] )?
#[allow(non_camel_case_types)]
pub struct $name;
impl $name {
pub fn init( $( $config_field: $config_type ),+ ) -> mf_core::extension::Extension {
let mut ext = mf_core::extension::Extension::new();
($init_fn)(&mut ext, $( $config_field ),+ );
ext
}
}
};
}
#[macro_export]
macro_rules! mf_global_attr {
($types:expr, $attributes:expr) => {{
use std::collections::HashMap;
use mf_model::schema::AttributeSpec;
let mut attr_map = HashMap::new();
let attributes: Vec<(&str, AttributeSpec)> = $attributes;
for (key, spec) in attributes {
attr_map.insert(key.to_string(), spec);
}
mf_core::types::GlobalAttributeItem {
types: $types.iter().map(|s| s.to_string()).collect(),
attributes: attr_map,
}
}};
($type_name:expr, $key:expr, $value:expr) => {{
use std::collections::HashMap;
use mf_model::schema::AttributeSpec;
use serde_json::Value;
let mut attr_map = HashMap::new();
attr_map.insert(
$key.to_string(),
AttributeSpec { default: Some(Value::String($value.to_string())) },
);
mf_core::types::GlobalAttributeItem {
types: vec![$type_name.to_string()],
attributes: attr_map,
}
}};
}
#[macro_export]
macro_rules! mf_op {
($name:ident, $body:block) => {
fn $name(
_manager: &mf_state::ops::GlobalResourceManager
) -> mf_core::ForgeResult<()> {
$body
}
};
($name:ident, |$manager:ident| $body:block) => {
fn $name(
$manager: &mf_state::ops::GlobalResourceManager
) -> mf_core::ForgeResult<()> {
$body
}
};
}
#[macro_export]
macro_rules! mf_node_transform {
($name:ident, $body:block) => {
fn $name(_node: &mf_core::node::Node) -> Option<mf_core::node::Node> {
$body
}
};
($name:ident, |$node:ident| $body:block) => {
fn $name($node: &mf_core::node::Node) -> Option<mf_core::node::Node> {
$body
}
};
}