packages feed

hydra-ext-0.17.0: src/main/haskell/Hydra/Graphql/Serde.hs

-- Note: this is an automatically generated file. Do not edit.
-- | Serialization functions for converting GraphQL AST to abstract expressions

module Hydra.Graphql.Serde where
import qualified Hydra.Ast as Ast
import qualified Hydra.Coders as Coders
import qualified Hydra.Core as Core
import qualified Hydra.Error.Checking as Checking
import qualified Hydra.Error.Core as ErrorCore
import qualified Hydra.Error.Packaging as ErrorPackaging
import qualified Hydra.Errors as Errors
import qualified Hydra.Graph as Graph
import qualified Hydra.Graphql.Syntax as Syntax
import qualified Hydra.Json.Model as Model
import qualified Hydra.Overlay.Haskell.Lib.Lists as Lists
import qualified Hydra.Overlay.Haskell.Lib.Optionals as Optionals
import qualified Hydra.Packaging as Packaging
import qualified Hydra.Parsing as Parsing
import qualified Hydra.Paths as Paths
import qualified Hydra.Query as Query
import qualified Hydra.Relational as Relational
import qualified Hydra.Serialization as Serialization
import qualified Hydra.Tabular as Tabular
import qualified Hydra.Testing as Testing
import qualified Hydra.Topology as Topology
import qualified Hydra.Typed as Typed
import qualified Hydra.Typing as Typing
import qualified Hydra.Util as Util
import qualified Hydra.Validation as Validation
import qualified Hydra.Variants as Variants
import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
import qualified Data.Scientific as Sci
-- | Convert a GraphQL definition to an expression
definitionToExpr :: Syntax.Definition -> Ast.Expr
definitionToExpr def =
    case def of
      Syntax.DefinitionExecutable _ -> Serialization.cst "Unsupported: executable definition"
      Syntax.DefinitionTypeSystem v0 -> typeSystemDefinitionOrExtensionToExpr v0
-- | Convert a GraphQL description to a triple-quoted comment
descriptionToExpr :: Syntax.Description -> Ast.Expr
descriptionToExpr desc =

      let delim = Serialization.cst "\"\"\""
          text = Syntax.unStringValue (Syntax.unDescription desc)
      in (Serialization.newlineSep [
        delim,
        (Serialization.cst text),
        delim])
-- | Convert a GraphQL document to an expression
documentToExpr :: Syntax.Document -> Ast.Expr
documentToExpr d = Serialization.doubleNewlineSep (Lists.map definitionToExpr (Syntax.unDocument d))
-- | Convert a GraphQL enum type definition to an expression
enumTypeDefinitionToExpr :: Syntax.EnumTypeDefinition -> Ast.Expr
enumTypeDefinitionToExpr def =

      let desc = Syntax.enumTypeDefinitionDescription def
          name = Syntax.enumTypeDefinitionName def
          values = Syntax.enumTypeDefinitionEnumValuesDefinition def
          valuesExpr = Optionals.cases values [] (\vs -> Lists.map enumValueDefinitionToExpr (Syntax.unEnumValuesDefinition vs))
      in (withDescription desc (Serialization.spaceSep [
        Serialization.cst "enum",
        (nameToExpr name),
        (Serialization.curlyBracesList Nothing Serialization.fullBlockStyle valuesExpr)]))
-- | Convert a GraphQL enum value definition to an expression
enumValueDefinitionToExpr :: Syntax.EnumValueDefinition -> Ast.Expr
enumValueDefinitionToExpr def =

      let desc = Syntax.enumValueDefinitionDescription def
          ev = Syntax.enumValueDefinitionEnumValue def
      in (withDescription desc (enumValueToExpr ev))
-- | Convert a GraphQL enum value to an expression
enumValueToExpr :: Syntax.EnumValue -> Ast.Expr
enumValueToExpr ev = nameToExpr (Syntax.unEnumValue ev)
-- | Convert a GraphQL field definition to an expression
fieldDefinitionToExpr :: Syntax.FieldDefinition -> Ast.Expr
fieldDefinitionToExpr def =

      let desc = Syntax.fieldDefinitionDescription def
          name = Syntax.fieldDefinitionName def
          typ = Syntax.fieldDefinitionType def
          namePart =
                  Serialization.noSep [
                    nameToExpr name,
                    (Serialization.cst ":")]
          typePart = typeToExpr typ
      in (withDescription desc (Serialization.spaceSep [
        namePart,
        typePart]))
-- | Convert a GraphQL list type to an expression
listTypeToExpr :: Syntax.ListType -> Ast.Expr
listTypeToExpr lt =
    Serialization.noSep [
      Serialization.cst "[",
      (typeToExpr (Syntax.unListType lt)),
      (Serialization.cst "]")]
-- | Convert a GraphQL name to an expression
nameToExpr :: Syntax.Name -> Ast.Expr
nameToExpr n = Serialization.cst (Syntax.unName n)
-- | Convert a GraphQL named type to an expression
namedTypeToExpr :: Syntax.NamedType -> Ast.Expr
namedTypeToExpr nt = nameToExpr (Syntax.unNamedType nt)
-- | Convert a GraphQL non-null type to an expression
nonNullTypeToExpr :: Syntax.NonNullType -> Ast.Expr
nonNullTypeToExpr nnt =

      let typeExpr =
              case nnt of
                Syntax.NonNullTypeNamed v0 -> namedTypeToExpr v0
                Syntax.NonNullTypeList v0 -> listTypeToExpr v0
      in (Serialization.noSep [
        typeExpr,
        (Serialization.cst "!")])
-- | Convert a GraphQL object type definition to an expression
objectTypeDefinitionToExpr :: Syntax.ObjectTypeDefinition -> Ast.Expr
objectTypeDefinitionToExpr def =

      let desc = Syntax.objectTypeDefinitionDescription def
          name = Syntax.objectTypeDefinitionName def
          fields = Syntax.objectTypeDefinitionFieldsDefinition def
          fieldsExpr = Optionals.cases fields [] (\fs -> Lists.map fieldDefinitionToExpr (Syntax.unFieldsDefinition fs))
      in (withDescription desc (Serialization.spaceSep [
        Serialization.cst "type",
        (nameToExpr name),
        (Serialization.curlyBracesList Nothing Serialization.fullBlockStyle fieldsExpr)]))
-- | Convert a GraphQL type definition to an expression
typeDefinitionToExpr :: Syntax.TypeDefinition -> Ast.Expr
typeDefinitionToExpr def =
    case def of
      Syntax.TypeDefinitionScalar _ -> Serialization.cst "Unsupported: scalar type definition"
      Syntax.TypeDefinitionObject v0 -> objectTypeDefinitionToExpr v0
      Syntax.TypeDefinitionInterface _ -> Serialization.cst "Unsupported: interface type definition"
      Syntax.TypeDefinitionUnion _ -> Serialization.cst "Unsupported: union type definition"
      Syntax.TypeDefinitionEnum v0 -> enumTypeDefinitionToExpr v0
      Syntax.TypeDefinitionInputObject _ -> Serialization.cst "Unsupported: input object type definition"
-- | Convert a GraphQL type system definition or extension to an expression
typeSystemDefinitionOrExtensionToExpr :: Syntax.TypeSystemDefinitionOrExtension -> Ast.Expr
typeSystemDefinitionOrExtensionToExpr de =
    case de of
      Syntax.TypeSystemDefinitionOrExtensionDefinition v0 -> typeSystemDefinitionToExpr v0
      Syntax.TypeSystemDefinitionOrExtensionExtension _ -> Serialization.cst "Unsupported: type system extension"
-- | Convert a GraphQL type system definition to an expression
typeSystemDefinitionToExpr :: Syntax.TypeSystemDefinition -> Ast.Expr
typeSystemDefinitionToExpr def =
    case def of
      Syntax.TypeSystemDefinitionSchema _ -> Serialization.cst "Unsupported: schema definition"
      Syntax.TypeSystemDefinitionType v0 -> typeDefinitionToExpr v0
      Syntax.TypeSystemDefinitionDirective _ -> Serialization.cst "Unsupported: directive definition"
-- | Convert a GraphQL type to an expression
typeToExpr :: Syntax.Type -> Ast.Expr
typeToExpr typ =
    case typ of
      Syntax.TypeNamed v0 -> namedTypeToExpr v0
      Syntax.TypeList v0 -> listTypeToExpr v0
      Syntax.TypeNonNull v0 -> nonNullTypeToExpr v0
-- | Prepend an optional description to an expression
withDescription :: Maybe Syntax.Description -> Ast.Expr -> Ast.Expr
withDescription mdesc expr =
    Serialization.newlineSep (Optionals.cat [
      Optionals.map descriptionToExpr mdesc,
      (Optionals.pure expr)])