{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Server.Internal.TH.Types
  ( ServerTypeDefinition (..),
    ServerDec,
    ServerDecContext (..),
    ServerConsD,
    ServerFieldDefinition (..),
    toServerField,
  )
where

import Data.Morpheus.Types.Internal.AST
  ( ANY,
    ConsD (..),
    FieldDefinition,
    IN,
    TypeDefinition,
    TypeKind,
    TypeName,
  )
import Relude

data ServerFieldDefinition cat s = ServerFieldDefinition
  { ServerFieldDefinition cat s -> Bool
isParametrized :: Bool,
    ServerFieldDefinition cat s -> Maybe TypeName
argumentsTypeName :: Maybe TypeName,
    ServerFieldDefinition cat s -> FieldDefinition cat s
originalField :: FieldDefinition cat s
  }
  deriving (Int -> ServerFieldDefinition cat s -> ShowS
[ServerFieldDefinition cat s] -> ShowS
ServerFieldDefinition cat s -> String
(Int -> ServerFieldDefinition cat s -> ShowS)
-> (ServerFieldDefinition cat s -> String)
-> ([ServerFieldDefinition cat s] -> ShowS)
-> Show (ServerFieldDefinition cat s)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (cat :: TypeCategory) (s :: Stage).
Int -> ServerFieldDefinition cat s -> ShowS
forall (cat :: TypeCategory) (s :: Stage).
[ServerFieldDefinition cat s] -> ShowS
forall (cat :: TypeCategory) (s :: Stage).
ServerFieldDefinition cat s -> String
showList :: [ServerFieldDefinition cat s] -> ShowS
$cshowList :: forall (cat :: TypeCategory) (s :: Stage).
[ServerFieldDefinition cat s] -> ShowS
show :: ServerFieldDefinition cat s -> String
$cshow :: forall (cat :: TypeCategory) (s :: Stage).
ServerFieldDefinition cat s -> String
showsPrec :: Int -> ServerFieldDefinition cat s -> ShowS
$cshowsPrec :: forall (cat :: TypeCategory) (s :: Stage).
Int -> ServerFieldDefinition cat s -> ShowS
Show)

toServerField :: FieldDefinition c s -> ServerFieldDefinition c s
toServerField :: FieldDefinition c s -> ServerFieldDefinition c s
toServerField = Bool
-> Maybe TypeName
-> FieldDefinition c s
-> ServerFieldDefinition c s
forall (cat :: TypeCategory) (s :: Stage).
Bool
-> Maybe TypeName
-> FieldDefinition cat s
-> ServerFieldDefinition cat s
ServerFieldDefinition Bool
False Maybe TypeName
forall a. Maybe a
Nothing

type ServerConsD cat s = ConsD (ServerFieldDefinition cat s)

--- Core
data ServerTypeDefinition cat s = ServerTypeDefinition
  { ServerTypeDefinition cat s -> TypeName
tName :: TypeName,
    ServerTypeDefinition cat s -> [ServerTypeDefinition IN s]
typeArgD :: [ServerTypeDefinition IN s],
    ServerTypeDefinition cat s -> [ServerConsD cat s]
tCons :: [ServerConsD cat s],
    ServerTypeDefinition cat s -> TypeKind
tKind :: TypeKind,
    ServerTypeDefinition cat s -> Maybe (TypeDefinition ANY s)
typeOriginal :: Maybe (TypeDefinition ANY s)
  }
  deriving (Int -> ServerTypeDefinition cat s -> ShowS
[ServerTypeDefinition cat s] -> ShowS
ServerTypeDefinition cat s -> String
(Int -> ServerTypeDefinition cat s -> ShowS)
-> (ServerTypeDefinition cat s -> String)
-> ([ServerTypeDefinition cat s] -> ShowS)
-> Show (ServerTypeDefinition cat s)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (cat :: TypeCategory) (s :: Stage).
Int -> ServerTypeDefinition cat s -> ShowS
forall (cat :: TypeCategory) (s :: Stage).
[ServerTypeDefinition cat s] -> ShowS
forall (cat :: TypeCategory) (s :: Stage).
ServerTypeDefinition cat s -> String
showList :: [ServerTypeDefinition cat s] -> ShowS
$cshowList :: forall (cat :: TypeCategory) (s :: Stage).
[ServerTypeDefinition cat s] -> ShowS
show :: ServerTypeDefinition cat s -> String
$cshow :: forall (cat :: TypeCategory) (s :: Stage).
ServerTypeDefinition cat s -> String
showsPrec :: Int -> ServerTypeDefinition cat s -> ShowS
$cshowsPrec :: forall (cat :: TypeCategory) (s :: Stage).
Int -> ServerTypeDefinition cat s -> ShowS
Show)

type ServerDec = Reader ServerDecContext

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