gqb 0.10.1

GQL Query Builder API.
Documentation
use crate::prelude::*;

/// A node template containing labels and properties
pub struct NodeTemplate
{
  /// Node labels
  pub labels: Vec<String>,
  /// Node properties
  pub properties: graphcore::ValueMap,
}

/// Trait for types that can be converted into a node template (labels and properties)
pub trait IntoMatchNodeTemplate
{
  /// Variable type for the template
  type VariableType: FromVariable + Into<Variable>;
  /// Convert the type into a node template (labels and properties)
  fn into_node_template(self) -> KeyOrTemplate<NodeTemplate>;
}

/// This trait indicates that the type can be used for creating nodes.
pub trait IntoCreateNodeTemplate
{
  /// Variable type for the template
  type VariableType: FromVariable + Into<Variable>;
  /// Convert the type into a node template (labels and properties)
  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 to generate IntoMatchNodeTemplate implementation for types that support IntoCreateNodeTemplate
#[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(),
    }
  }
}