hydra-0.15.0: src/main/haskell/Hydra/Graphviz/Serde.hs
-- Note: this is an automatically generated file. Do not edit.
-- | Serialization functions for converting Graphviz DOT AST to abstract expressions
module Hydra.Graphviz.Serde where
import qualified Hydra.Ast as Ast
import qualified Hydra.Graphviz.Dot as Dot
import qualified Hydra.Lib.Lists as Lists
import qualified Hydra.Lib.Logic as Logic
import qualified Hydra.Lib.Maybes as Maybes
import qualified Hydra.Lib.Strings as Strings
import qualified Hydra.Serialization as Serialization
import Prelude hiding (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
import qualified Data.Scientific as Sci
-- | Convert an attribute list to an expression
writeAttrList :: Dot.AttrList -> Ast.Expr
writeAttrList al =
Serialization.spaceSep (Lists.map (\alist -> Serialization.brackets Serialization.squareBrackets Serialization.inlineStyle (Serialization.commaSep Serialization.inlineStyle (Lists.map writeEqualityPair alist))) (Dot.unAttrList al))
-- | Convert an attribute statement to an expression
writeAttrStmt :: Dot.AttrStmt -> Ast.Expr
writeAttrStmt as =
let t = Dot.attrStmtType as
attr = Dot.attrStmtAttributes as
in (Serialization.spaceSep [
writeAttrType t,
(writeAttrList attr)])
-- | Convert an attribute type to an expression
writeAttrType :: Dot.AttrType -> Ast.Expr
writeAttrType t =
case t of
Dot.AttrTypeGraph -> Serialization.cst "graph"
Dot.AttrTypeNode -> Serialization.cst "node"
Dot.AttrTypeEdge -> Serialization.cst "edge"
-- | Convert a compass point to an expression
writeCompassPt :: Dot.CompassPt -> Ast.Expr
writeCompassPt p =
case p of
Dot.CompassPtN -> Serialization.cst "n"
Dot.CompassPtNe -> Serialization.cst "ne"
Dot.CompassPtE -> Serialization.cst "e"
Dot.CompassPtSe -> Serialization.cst "se"
Dot.CompassPtS -> Serialization.cst "s"
Dot.CompassPtSw -> Serialization.cst "sw"
Dot.CompassPtW -> Serialization.cst "w"
Dot.CompassPtNw -> Serialization.cst "nw"
Dot.CompassPtC -> Serialization.cst "c"
Dot.CompassPtNone -> Serialization.cst "none"
-- | Convert an edge statement to an expression
writeEdgeStmt :: Bool -> Dot.EdgeStmt -> Ast.Expr
writeEdgeStmt directed es =
let l = Dot.edgeStmtLeft es
r = Dot.edgeStmtRight es
attr = Dot.edgeStmtAttributes es
arrow = Logic.ifElse directed "->" "--"
rhsParts =
Lists.concat (Lists.map (\n -> [
Serialization.cst arrow,
(writeNodeOrSubgraph directed n)]) r)
attrParts = Maybes.maybe [] (\a -> [
writeAttrList a]) attr
in (Serialization.spaceSep (Lists.concat [
[
writeNodeOrSubgraph directed l],
rhsParts,
attrParts]))
-- | Convert an equality pair to an expression
writeEqualityPair :: Dot.EqualityPair -> Ast.Expr
writeEqualityPair eq =
let l = Dot.equalityPairLeft eq
r = Dot.equalityPairRight eq
in (Serialization.spaceSep [
writeId l,
(Serialization.cst "="),
(writeId r)])
-- | Convert a graph to an expression
writeGraph :: Dot.Graph -> Ast.Expr
writeGraph g =
let strict = Dot.graphStrict g
directed = Dot.graphDirected g
stmts = Dot.graphStatements g
graphKeyword = Logic.ifElse directed "digraph" "graph"
graphExpr =
Logic.ifElse strict (Serialization.spaceSep [
Serialization.cst "strict",
(Serialization.cst graphKeyword)]) (Serialization.cst graphKeyword)
body =
Serialization.brackets Serialization.curlyBraces Serialization.fullBlockStyle (Serialization.symbolSep ";" Serialization.fullBlockStyle (Lists.map (writeStmt directed) stmts))
in (Serialization.spaceSep [
graphExpr,
body])
-- | Convert an identifier to an expression
writeId :: Dot.Id -> Ast.Expr
writeId i =
Serialization.cst (Strings.cat [
"\"",
(Dot.unId i),
"\""])
-- | Convert a node identifier to an expression
writeNodeId :: Dot.NodeId -> Ast.Expr
writeNodeId nid =
let i = Dot.nodeIdId nid
mp = Dot.nodeIdPort nid
in (Serialization.noSep (Maybes.cat [
Maybes.pure (writeId i),
(Maybes.map writePort mp)]))
-- | Convert a node or subgraph to an expression
writeNodeOrSubgraph :: Bool -> Dot.NodeOrSubgraph -> Ast.Expr
writeNodeOrSubgraph directed ns =
case ns of
Dot.NodeOrSubgraphNode v0 -> writeNodeId v0
Dot.NodeOrSubgraphSubgraph v0 -> writeSubgraph directed v0
-- | Convert a node statement to an expression
writeNodeStmt :: Dot.NodeStmt -> Ast.Expr
writeNodeStmt ns =
let i = Dot.nodeStmtId ns
attr = Dot.nodeStmtAttributes ns
in (Serialization.spaceSep (Maybes.cat [
Maybes.pure (writeNodeId i),
(Maybes.map writeAttrList attr)]))
-- | Convert a port to an expression
writePort :: Dot.Port -> Ast.Expr
writePort p =
let mi = Dot.portId p
mp = Dot.portPosition p
pre =
Maybes.maybe [] (\i -> [
Serialization.cst ":",
(writeId i)]) mi
suf =
Maybes.maybe [] (\cp -> [
Serialization.cst ":",
(writeCompassPt cp)]) mp
in (Serialization.noSep (Lists.concat [
pre,
suf]))
-- | Convert a statement to an expression
writeStmt :: Bool -> Dot.Stmt -> Ast.Expr
writeStmt directed s =
case s of
Dot.StmtNode v0 -> writeNodeStmt v0
Dot.StmtEdge v0 -> writeEdgeStmt directed v0
Dot.StmtAttr v0 -> writeAttrStmt v0
Dot.StmtEquals v0 -> writeEqualityPair v0
Dot.StmtSubgraph v0 -> writeSubgraph directed v0
-- | Convert a subgraph to an expression
writeSubgraph :: Bool -> Dot.Subgraph -> Ast.Expr
writeSubgraph directed sg =
let mid = Dot.subgraphSubgraphId sg
stmts = Dot.subgraphStatements sg
body =
Serialization.brackets Serialization.curlyBraces Serialization.inlineStyle (Serialization.spaceSep (Lists.map (writeStmt directed) stmts))
in (Serialization.spaceSep (Maybes.cat [
Maybes.map writeSubgraphId mid,
(Maybes.pure body)]))
-- | Convert a subgraph identifier to an expression
writeSubgraphId :: Dot.SubgraphId -> Ast.Expr
writeSubgraphId sid =
Serialization.spaceSep (Maybes.cat [
Maybes.pure (Serialization.cst "subgraph"),
(Maybes.map writeId (Dot.unSubgraphId sid))])