packages feed

bolt-0.3.2.0: lib/Database/Bolt/Protocol/Ver1/Graph.hs

{-# LANGUAGE OverloadedStrings #-}

module Database.Bolt.Protocol.Ver1.Graph (
  Node (..),
  Relationship (..),
  Path (..),
  UnboundedRelationship (..),
)
where

import Data.Int
import Data.PackStream

import Database.Bolt.Protocol.Ver1.Types

data Node = Node
  { nodeIdentity :: Identity
  , nodeLabels :: [Label]
  , nodeProperties :: Properties
  }
  deriving (Show, Eq)

data Relationship = Relationship
  { relIdentity :: Identity
  , startNodeIdentity :: Identity
  , endNodeIdentity :: Identity
  , relType :: Type
  , relProperties :: Properties
  }
  deriving (Show, Eq)

data Path = Path
  { pathNodes :: [Node]
  , pathRelationships :: [UnboundedRelationship]
  , pathSequence :: [Int64]
  }
  deriving (Show, Eq)

data UnboundedRelationship = UnboundedRelationship
  { urelIdentity :: Identity
  , urelType :: Type
  , urelProperties :: Properties
  }
  deriving (Show, Eq)

instance ToPackStream Node where
  toPackStream (Node nodeid labels props) = Struct 0x4e [toPackStream nodeid, toPackStream labels, toPackStream props]

instance FromPackStream Node where
  parsePackStream s = do
    struct <- parsePackStream s
    case struct of
      (Struct 0x4e [nodeid, labels, props]) -> Node <$> parsePackStream nodeid <*> parsePackStream labels <*> parsePackStream props
      _ -> error "Invalid Node"

instance ToPackStream Relationship where
  toPackStream (Relationship relid start end ty props) =
    Struct
      0x52
      [ toPackStream relid
      , toPackStream start
      , toPackStream end
      , toPackStream ty
      , toPackStream props
      ]

instance FromPackStream Relationship where
  parsePackStream s = do
    struct <- parsePackStream s
    case struct of
      (Struct 0x52 [relid, start, end, ty, props]) ->
        Relationship
          <$> parsePackStream relid
          <*> parsePackStream start
          <*> parsePackStream end
          <*> parsePackStream ty
          <*> parsePackStream props
      _ -> error "Invalid Relationship"

instance ToPackStream Path where
  toPackStream (Path nodes rels seqn) = Struct 0x50 [toPackStream nodes, toPackStream rels, toPackStream seqn]

instance FromPackStream Path where
  parsePackStream s = do
    struct <- parsePackStream s
    case struct of
      (Struct 0x50 [nodes, rels, seqn]) -> Path <$> parsePackStream nodes <*> parsePackStream rels <*> parsePackStream seqn
      _ -> error "Invalid Path"

instance ToPackStream UnboundedRelationship where
  toPackStream (UnboundedRelationship relid ty props) = Struct 0x72 [toPackStream relid, toPackStream ty, toPackStream props]

instance FromPackStream UnboundedRelationship where
  parsePackStream s = do
    struct <- parsePackStream s
    case struct of
      (Struct 0x72 [relid, ty, props]) -> UnboundedRelationship <$> parsePackStream relid <*> parsePackStream ty <*> parsePackStream props
      _ -> error "Invalid UnboundedRelationship"