use crate::prelude::*;
pub struct MatchEdgeTemplate
{
pub source: Option<Variable>,
pub destination: Option<Variable>,
pub labels: Vec<String>,
pub properties: graphcore::ValueMap,
}
pub trait IntoMatchEdgeTemplate
{
type VariableType: FromVariable + Into<Variable>;
fn into_edge_template(self, builder: &mut Builder) -> KeyOrTemplate<MatchEdgeTemplate>;
}
impl IntoMatchEdgeTemplate for MatchEdgeTemplate
{
type VariableType = Variable;
fn into_edge_template(self, _: &mut Builder) -> KeyOrTemplate<MatchEdgeTemplate>
{
KeyOrTemplate::Template(self)
}
}
pub struct CreateEdgeTemplate
{
pub source: Variable,
pub destination: Variable,
pub labels: Vec<String>,
pub properties: graphcore::ValueMap,
}
pub trait IntoCreateEdgeTemplate
{
type VariableType: FromVariable + Into<Variable>;
fn into_edge_template(self, builder: &mut Builder) -> CreateEdgeTemplate;
}
impl IntoCreateEdgeTemplate for CreateEdgeTemplate
{
type VariableType = Variable;
fn into_edge_template(self, _: &mut Builder) -> CreateEdgeTemplate
{
self
}
}
#[macro_export]
macro_rules! match_edge_template {
($type:ty) => {
impl IntoMatchEdgeTemplate for $type
{
type VariableType = <Self as $crate::IntoCreateEdgeTemplate>::VariableType;
fn into_edge_template(
self,
builder: &mut Builder,
) -> $crate::KeyOrTemplate<(
Option<$crate::Variable>,
Vec<String>,
graphcore::ValueMap,
Option<$crate::Variable>,
)>
{
let (src, labels, props, dst) =
<Self as $crate::IntoCreateEdgeTemplate>::into_edge_template(self, builder);
$crate::KeyOrTemplate::Template((Some(src), labels, props, Some(dst)))
}
}
};
}
#[macro_export]
macro_rules! match_edge_template_for_alias {
($type:ty, $alias:tt) => {
impl IntoMatchEdgeTemplate for $type
{
type VariableType = <$alias as $crate::IntoCreateEdgeTemplate>::VariableType;
fn into_edge_template(self, builder: &mut Builder)
-> KeyOrTemplate<$crate::MatchEdgeTemplate>
{
let template =
<$alias as $crate::IntoCreateEdgeTemplate>::into_edge_template(self.0, builder);
KeyOrTemplate::Template($crate::MatchEdgeTemplate {
source: Some(template.source),
destination: Some(template.destination),
labels: template.labels,
properties: template.properties,
})
}
}
};
}
impl<T0, T1, T2, T3> IntoMatchEdgeTemplate for (T0, T1, T2, T3)
where
T0: Into<Option<Variable>>,
T1: Into<Vec<String>>,
T2: Into<graphcore::ValueMap>,
T3: Into<Option<Variable>>,
{
type VariableType = Variable;
fn into_edge_template(self, _builder: &mut Builder) -> KeyOrTemplate<MatchEdgeTemplate>
{
KeyOrTemplate::Template(MatchEdgeTemplate {
source: self.0.into(),
destination: self.3.into(),
labels: self.1.into(),
properties: self.2.into(),
})
}
}
impl<T0, T1, T2, T3> IntoCreateEdgeTemplate for (T0, T1, T2, T3)
where
T0: Into<Variable>,
T1: Into<Vec<String>>,
T2: Into<graphcore::ValueMap>,
T3: Into<Variable>,
{
type VariableType = Variable;
fn into_edge_template(self, _builder: &mut Builder) -> CreateEdgeTemplate
{
CreateEdgeTemplate {
source: self.0.into(),
destination: self.3.into(),
labels: self.1.into(),
properties: self.2.into(),
}
}
}