packages feed

hydra-0.15.0: src/main/haskell/Hydra/Pegasus/Serde.hs

-- Note: this is an automatically generated file. Do not edit.

-- | Serialization functions for converting Pegasus PDL AST to abstract expressions

module Hydra.Pegasus.Serde where

import qualified Hydra.Ast as Ast
import qualified Hydra.Formatting as Formatting
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.Pegasus.Pdl as Pdl
import qualified Hydra.Serialization as Serialization
import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
import qualified Data.Scientific as Sci

-- | Convert PDL annotations to an optional expression (doc comment)
exprAnnotations :: Pdl.Annotations -> Maybe Ast.Expr
exprAnnotations anns =

      let d = Pdl.annotationsDoc anns
      in (Maybes.map (\s -> Serialization.cst (Formatting.javaStyleComment s)) d)

-- | Convert a PDL enum field to an expression
exprEnumField :: Pdl.EnumField -> Ast.Expr
exprEnumField ef =

      let name = Pdl.unEnumFieldName (Pdl.enumFieldName ef)
          anns = Pdl.enumFieldAnnotations ef
      in (withAnnotations anns (Serialization.cst name))

-- | Convert a qualified name to an import expression
exprImport :: Pdl.QualifiedName -> Ast.Expr
exprImport qn =
    Serialization.spaceSep [
      Serialization.cst "import",
      (exprQualifiedName qn)]

-- | Convert a named schema to an expression
exprNamedSchema :: Pdl.NamedSchema -> Ast.Expr
exprNamedSchema ns =

      let qn = Pdl.namedSchemaQualifiedName ns
          t = Pdl.namedSchemaType ns
          anns = Pdl.namedSchemaAnnotations ns
      in (withAnnotations anns (case t of
        Pdl.NamedSchemaTypeRecord v0 ->
          let fields = Pdl.recordSchemaFields v0
          in (Serialization.spaceSep [
            Serialization.cst "record",
            (exprQualifiedName qn),
            (Serialization.curlyBracesList Nothing Serialization.fullBlockStyle (Lists.map exprRecordField fields))])
        Pdl.NamedSchemaTypeEnum v0 ->
          let fields = Pdl.enumSchemaFields v0
          in (Serialization.spaceSep [
            Serialization.cst "enum",
            (exprQualifiedName qn),
            (Serialization.curlyBracesList Nothing Serialization.fullBlockStyle (Lists.map exprEnumField fields))])
        Pdl.NamedSchemaTypeTyperef v0 -> Serialization.spaceSep [
          Serialization.cst "typeref",
          (exprQualifiedName qn),
          (Serialization.cst "="),
          (exprSchema v0)]))

-- | Convert a primitive type to an expression
exprPrimitiveType :: Pdl.PrimitiveType -> Ast.Expr
exprPrimitiveType pt =
    Serialization.cst (case pt of
      Pdl.PrimitiveTypeBoolean -> "boolean"
      Pdl.PrimitiveTypeBytes -> "bytes"
      Pdl.PrimitiveTypeDouble -> "double"
      Pdl.PrimitiveTypeFloat -> "float"
      Pdl.PrimitiveTypeInt -> "int"
      Pdl.PrimitiveTypeLong -> "long"
      Pdl.PrimitiveTypeString -> "string")

-- | Convert a qualified name to an expression
exprQualifiedName :: Pdl.QualifiedName -> Ast.Expr
exprQualifiedName qn =

      let name = Pdl.unName (Pdl.qualifiedNameName qn)
          ns = Pdl.qualifiedNameNamespace qn
          parts =
                  Maybes.cat [
                    Maybes.map (\n -> Pdl.unNamespace n) ns,
                    (Maybes.pure name)]
      in (Serialization.cst (Strings.intercalate "." parts))

-- | Convert a record field to an expression
exprRecordField :: Pdl.RecordField -> Ast.Expr
exprRecordField rf =

      let name = Pdl.unFieldName (Pdl.recordFieldName rf)
          schema = Pdl.recordFieldValue rf
          optional = Pdl.recordFieldOptional rf
          anns = Pdl.recordFieldAnnotations rf
      in (withAnnotations anns (Serialization.spaceSep (Maybes.cat [
        Maybes.pure (Serialization.cst (Strings.cat2 name ":")),
        (Logic.ifElse optional (Maybes.pure (Serialization.cst "optional")) Nothing),
        (Maybes.pure (exprSchema schema))])))

-- | Convert a schema to an expression
exprSchema :: Pdl.Schema -> Ast.Expr
exprSchema schema =
    case schema of
      Pdl.SchemaArray v0 -> Serialization.noSep [
        Serialization.cst "array",
        (Serialization.bracketList Serialization.inlineStyle [
          exprSchema v0])]
      Pdl.SchemaMap v0 -> Serialization.noSep [
        Serialization.cst "map",
        (Serialization.bracketList Serialization.inlineStyle [
          Serialization.cst "string",
          (exprSchema v0)])]
      Pdl.SchemaNamed v0 -> exprQualifiedName v0
      Pdl.SchemaNull -> Serialization.cst "null"
      Pdl.SchemaPrimitive v0 -> exprPrimitiveType v0
      Pdl.SchemaUnion v0 -> Serialization.noSep [
        Serialization.cst "union",
        (Serialization.bracketList Serialization.fullBlockStyle (Lists.map exprUnionMember (Pdl.unUnionSchema v0)))]

-- | Convert a schema file to an expression
exprSchemaFile :: Pdl.SchemaFile -> Ast.Expr
exprSchemaFile sf =

      let ns = Pdl.unNamespace (Pdl.schemaFileNamespace sf)
          pkg = Pdl.schemaFilePackage sf
          imports = Pdl.schemaFileImports sf
          schemas = Pdl.schemaFileSchemas sf
          namespaceSec =
                  Maybes.pure (Serialization.spaceSep [
                    Serialization.cst "namespace",
                    (Serialization.cst ns)])
          packageSec =
                  Maybes.map (\p -> Serialization.spaceSep [
                    Serialization.cst "package",
                    (Serialization.cst (Pdl.unPackage p))]) pkg
          importsSec = Logic.ifElse (Lists.null imports) Nothing (Maybes.pure (Serialization.newlineSep (Lists.map exprImport imports)))
          schemaSecs = Lists.map (\s -> Maybes.pure (exprNamedSchema s)) schemas
      in (Serialization.doubleNewlineSep (Maybes.cat (Lists.concat [
        [
          namespaceSec,
          packageSec,
          importsSec],
        schemaSecs])))

-- | Convert a union member to an expression
exprUnionMember :: Pdl.UnionMember -> Ast.Expr
exprUnionMember um =

      let alias = Pdl.unionMemberAlias um
          schema = Pdl.unionMemberValue um
          anns = Pdl.unionMemberAnnotations um
      in (withAnnotations anns (Serialization.spaceSep (Maybes.cat [
        Maybes.map (\fn -> Serialization.cst (Strings.cat2 (Pdl.unFieldName fn) ":")) alias,
        (Maybes.pure (exprSchema schema))])))

-- | Prepend annotations (doc comment) to an expression
withAnnotations :: Pdl.Annotations -> Ast.Expr -> Ast.Expr
withAnnotations anns expr =
    Serialization.newlineSep (Maybes.cat [
      exprAnnotations anns,
      (Maybes.pure expr)])