module DataFlow.JSONGraphFormat (
Val(..),
Metadata(),
Document(..),
Graph(..),
Node(..),
Edge(..)
) where
import Data.Aeson
import Data.Aeson.Types (Pair)
import qualified Data.Map as M
import Data.Vector (fromList)
data Val = Str String
| Arr [Val]
instance ToJSON Val where
toJSON (Str s) = toJSON s
toJSON (Arr vs) = toJSON vs
type Metadata = M.Map String Val
data Document = SingleGraph { graph :: Graph }
| MultiGraph { graphs :: [Graph] }
instance ToJSON Document where
toJSON (SingleGraph g) = object [
"graph" .= toJSON g
]
toJSON (MultiGraph gs) = object [
"graphs" .= toJSON gs
]
data Graph = Graph { nodes :: [Node]
, edges :: [Edge]
, graphLabel :: Maybe String
, graphMetadata :: Metadata
}
instance ToJSON Graph where
toJSON (Graph nodes edges lbl metadata) = object $
labelField lbl ++ [
"nodes" .= toJSON nodes,
"edges" .= toJSON edges,
"metadata" .= toJSON metadata
]
data Node = Node { id :: String
, nodeLabel :: Maybe String
, nodeMetadata :: Metadata }
instance ToJSON Node where
toJSON (Node id' lbl metadata) = object $
labelField lbl ++ [
"id" .= toJSON id',
"metadata" .= toJSON metadata
]
data Edge = Edge { source :: String
, target :: String
, edgeLabel :: Maybe String
, edgeMetadata :: Metadata }
instance ToJSON Edge where
toJSON (Edge source target lbl metadata) = object $
labelField lbl ++ [
"source" .= toJSON source,
"target" .= toJSON target,
"metadata" .= toJSON metadata
]
labelField :: Maybe String -> [Pair]
labelField (Just s) = [("label", toJSON s)]
labelField _ = []