#![allow(unused_mut)]
use std::collections::BTreeSet;
use crate::{
builder::{ResourceBuilderView, ValidationError},
dsl::ir::DSLParams,
node::DynNode,
};
pub type NodeFactory =
fn(&mut ResourceBuilderView, &DSLParams) -> Result<Box<dyn DynNode>, ValidationError>;
#[derive(Debug)]
pub struct NodeSpec {
pub name: String,
pub required_params: BTreeSet<String>,
pub optional_params: BTreeSet<String>,
pub build: NodeFactory,
}
impl NodeSpec {
pub fn check_for_bad_params(&self, params: &DSLParams) {
for k in params.0.keys() {
if !self.required_params.contains(k) && !self.optional_params.contains(k) {
panic!("Invalid params {} found on node {}", k, self.name);
}
}
}
}
#[macro_export]
macro_rules! node_spec {
(
$name:expr,
required = [$($req:expr),*],
optional = [$($opt:expr),*],
build = $build:expr
) => {
{
let mut req_params = std::collections::BTreeSet::new();
$(req_params.insert(String::from($req));)*
let mut opt_params = std::collections::BTreeSet::new();
$(opt_params.insert(String::from($opt));)*
($name, NodeSpec {
name: $name,
required_params: req_params,
optional_params: opt_params,
build: $build, })
}
};
}