{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.CodeGen.Internal.AST
  ( ModuleDefinition (..),
    CodeGenConfig (..),
    ServerTypeDefinition (..),
    GQLTypeDefinition (..),
    CONST,
    TypeKind (..),
    TypeName,
    TypeRef (..),
    TypeWrapper (..),
    unpackName,
    DerivingClass (..),
    FIELD_TYPE_WRAPPER (..),
    ServerConstructorDefinition (..),
    ServerFieldDefinition (..),
    Kind (..),
  )
where

import Data.Morpheus.Types.Internal.AST
  ( CONST,
    Description,
    Directives,
    FieldName,
    TypeKind (..),
    TypeKind,
    TypeName,
    TypeName,
    TypeRef (..),
    TypeRef,
    TypeWrapper (..),
    Value,
    unpackName,
  )
import Relude

data ModuleDefinition = ModuleDefinition
  { ModuleDefinition -> Text
moduleName :: Text,
    ModuleDefinition -> [(Text, [Text])]
imports :: [(Text, [Text])],
    ModuleDefinition -> [Text]
extensions :: [Text],
    ModuleDefinition -> [ServerTypeDefinition]
types :: [ServerTypeDefinition]
  }

data FIELD_TYPE_WRAPPER
  = MONAD
  | SUBSCRIPTION
  | PARAMETRIZED
  | ARG TypeName
  | TAGGED_ARG FieldName TypeRef
  | GQL_WRAPPER TypeWrapper
  deriving (Int -> FIELD_TYPE_WRAPPER -> ShowS
[FIELD_TYPE_WRAPPER] -> ShowS
FIELD_TYPE_WRAPPER -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FIELD_TYPE_WRAPPER] -> ShowS
$cshowList :: [FIELD_TYPE_WRAPPER] -> ShowS
show :: FIELD_TYPE_WRAPPER -> String
$cshow :: FIELD_TYPE_WRAPPER -> String
showsPrec :: Int -> FIELD_TYPE_WRAPPER -> ShowS
$cshowsPrec :: Int -> FIELD_TYPE_WRAPPER -> ShowS
Show)

data DerivingClass
  = SHOW
  | GENERIC
  deriving (Int -> DerivingClass -> ShowS
[DerivingClass] -> ShowS
DerivingClass -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DerivingClass] -> ShowS
$cshowList :: [DerivingClass] -> ShowS
show :: DerivingClass -> String
$cshow :: DerivingClass -> String
showsPrec :: Int -> DerivingClass -> ShowS
$cshowsPrec :: Int -> DerivingClass -> ShowS
Show)

data ServerFieldDefinition = ServerFieldDefinition
  { ServerFieldDefinition -> Text
fieldType :: Text,
    ServerFieldDefinition -> FieldName
fieldName :: FieldName,
    ServerFieldDefinition -> [FIELD_TYPE_WRAPPER]
wrappers :: [FIELD_TYPE_WRAPPER]
  }
  deriving (Int -> ServerFieldDefinition -> ShowS
[ServerFieldDefinition] -> ShowS
ServerFieldDefinition -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ServerFieldDefinition] -> ShowS
$cshowList :: [ServerFieldDefinition] -> ShowS
show :: ServerFieldDefinition -> String
$cshow :: ServerFieldDefinition -> String
showsPrec :: Int -> ServerFieldDefinition -> ShowS
$cshowsPrec :: Int -> ServerFieldDefinition -> ShowS
Show)

data Kind = Scalar | Type deriving (Int -> Kind -> ShowS
[Kind] -> ShowS
Kind -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Kind] -> ShowS
$cshowList :: [Kind] -> ShowS
show :: Kind -> String
$cshow :: Kind -> String
showsPrec :: Int -> Kind -> ShowS
$cshowsPrec :: Int -> Kind -> ShowS
Show)

data GQLTypeDefinition = GQLTypeDefinition
  { GQLTypeDefinition -> Kind
gqlKind :: Kind,
    GQLTypeDefinition -> Maybe Text
gqlTypeDescription :: Maybe Text,
    GQLTypeDefinition -> Map Text Text
gqlTypeDescriptions :: Map Text Description,
    GQLTypeDefinition -> Map Text (Directives CONST)
gqlTypeDirectives :: Map Text (Directives CONST),
    GQLTypeDefinition -> Map Text (Value CONST)
gqlTypeDefaultValues :: Map Text (Value CONST)
  }
  deriving (Int -> GQLTypeDefinition -> ShowS
[GQLTypeDefinition] -> ShowS
GQLTypeDefinition -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GQLTypeDefinition] -> ShowS
$cshowList :: [GQLTypeDefinition] -> ShowS
show :: GQLTypeDefinition -> String
$cshow :: GQLTypeDefinition -> String
showsPrec :: Int -> GQLTypeDefinition -> ShowS
$cshowsPrec :: Int -> GQLTypeDefinition -> ShowS
Show)

data ServerConstructorDefinition = ServerConstructorDefinition
  { ServerConstructorDefinition -> TypeName
constructorName :: TypeName,
    ServerConstructorDefinition -> [ServerFieldDefinition]
constructorFields :: [ServerFieldDefinition]
  }
  deriving (Int -> ServerConstructorDefinition -> ShowS
[ServerConstructorDefinition] -> ShowS
ServerConstructorDefinition -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ServerConstructorDefinition] -> ShowS
$cshowList :: [ServerConstructorDefinition] -> ShowS
show :: ServerConstructorDefinition -> String
$cshow :: ServerConstructorDefinition -> String
showsPrec :: Int -> ServerConstructorDefinition -> ShowS
$cshowsPrec :: Int -> ServerConstructorDefinition -> ShowS
Show)

data ServerTypeDefinition
  = ServerTypeDefinition
      { ServerTypeDefinition -> Text
tName :: Text,
        ServerTypeDefinition -> [Text]
typeParameters :: [Text],
        ServerTypeDefinition -> [ServerConstructorDefinition]
tCons :: [ServerConstructorDefinition],
        ServerTypeDefinition -> TypeKind
tKind :: TypeKind,
        ServerTypeDefinition -> [DerivingClass]
derives :: [DerivingClass],
        ServerTypeDefinition -> Maybe GQLTypeDefinition
gql :: Maybe GQLTypeDefinition
      }
  | ServerInterfaceDefinition
      TypeName
      TypeName
      TypeName
  deriving (Int -> ServerTypeDefinition -> ShowS
[ServerTypeDefinition] -> ShowS
ServerTypeDefinition -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ServerTypeDefinition] -> ShowS
$cshowList :: [ServerTypeDefinition] -> ShowS
show :: ServerTypeDefinition -> String
$cshow :: ServerTypeDefinition -> String
showsPrec :: Int -> ServerTypeDefinition -> ShowS
$cshowsPrec :: Int -> ServerTypeDefinition -> ShowS
Show)

newtype CodeGenConfig = CodeGenConfig
  { CodeGenConfig -> Bool
namespace :: Bool
  }