use crate::prelude::*;
pub struct NodeTemplate
{
pub labels: Vec<String>,
pub properties: graphcore::ValueMap,
}
pub trait IntoMatchNodeTemplate
{
type VariableType: FromVariable + Into<Variable>;
fn into_node_template(self) -> KeyOrTemplate<NodeTemplate>;
}
pub trait IntoCreateNodeTemplate
{
type VariableType: FromVariable + Into<Variable>;
fn into_node_template(self) -> NodeTemplate;
}
impl IntoMatchNodeTemplate for NodeTemplate
{
type VariableType = Variable;
fn into_node_template(self) -> KeyOrTemplate<NodeTemplate>
{
KeyOrTemplate::Template(self)
}
}
impl IntoCreateNodeTemplate for NodeTemplate
{
type VariableType = Variable;
fn into_node_template(self) -> NodeTemplate
{
self
}
}
#[macro_export]
macro_rules! match_node_template {
($type:ty) => {
impl $crate::IntoMatchNodeTemplate for $type
{
type VariableType = <Self as $crate::IntoCreateNodeTemplate>::VariableType;
fn into_node_template(self) -> $crate::KeyOrTemplate<$crate::NodeTemplate>
{
$crate::KeyOrTemplate::Template(
<Self as $crate::IntoCreateNodeTemplate>::into_node_template(self),
)
}
}
};
}
impl<TLabels, TProperties> IntoMatchNodeTemplate for (TLabels, TProperties)
where
TLabels: Into<Vec<String>>,
TProperties: Into<graphcore::ValueMap>,
{
type VariableType = Variable;
fn into_node_template(self) -> KeyOrTemplate<NodeTemplate>
{
KeyOrTemplate::Template(NodeTemplate {
labels: self.0.into(),
properties: self.1.into(),
})
}
}
impl<TLabels, TProperties> IntoCreateNodeTemplate for (TLabels, TProperties)
where
TLabels: Into<Vec<String>>,
TProperties: Into<graphcore::ValueMap>,
{
type VariableType = Variable;
fn into_node_template(self) -> NodeTemplate
{
NodeTemplate {
labels: self.0.into(),
properties: self.1.into(),
}
}
}