{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Core
  ( parseDSL,
    parseFullGQLDocument,
    parseGQLDocument,
    parseTypeSystemDefinition,
    parseTypeDefinitions,
    validateRequest,
    parseRequestWith,
    validateSchema,
    parseRequest,
    SelectionTree (..),
    Config (..),
    VALIDATION_MODE (..),
    defaultConfig,
    debugConfig,
    App (..),
    AppData (..),
    runApp,
    withDebugger,
    mkApp,
    runAppStream,
    render,
    RenderGQL,
  )
where

import Data.ByteString.Lazy.Char8
  ( ByteString,
  )
import Data.Morpheus.Ext.SemigroupM
  ( (<:>),
  )
import Data.Morpheus.Parser
  ( parseRequest,
    parseRequestWith,
    parseTypeDefinitions,
    parseTypeSystemDefinition,
  )
import Data.Morpheus.Rendering.RenderGQL (RenderGQL)
import qualified Data.Morpheus.Rendering.RenderGQL as R
import Data.Morpheus.Schema.Schema (internalSchema)
import Data.Morpheus.Types.App
  ( App (..),
    AppData (..),
    mkApp,
    runApp,
    runAppStream,
    withDebugger,
  )
import Data.Morpheus.Types.Internal.AST
  ( Schema,
    VALID,
  )
import Data.Morpheus.Types.Internal.Config
  ( Config (..),
    VALIDATION_MODE (..),
    debugConfig,
    defaultConfig,
  )
import Data.Morpheus.Types.Internal.Resolving
  ( Eventless,
    resultOr,
    sortErrors,
  )
import Data.Morpheus.Types.SelectionTree (SelectionTree (..))
import Data.Morpheus.Validation.Document.Validation (ValidateSchema (..))
import Data.Morpheus.Validation.Query.Validation
  ( validateRequest,
  )
import Relude hiding (ByteString)

render :: RenderGQL a => a -> ByteString
render :: a -> ByteString
render = a -> ByteString
forall a. RenderGQL a => a -> ByteString
R.renderGQL

parseDSL :: ByteString -> Either String (Schema VALID)
parseDSL :: ByteString -> Either String (Schema VALID)
parseDSL = (GQLErrors -> Either String (Schema VALID))
-> (Schema VALID -> Either String (Schema VALID))
-> Result () (Schema VALID)
-> Either String (Schema VALID)
forall a' a e. (GQLErrors -> a') -> (a -> a') -> Result e a -> a'
resultOr (String -> Either String (Schema VALID)
forall a b. a -> Either a b
Left (String -> Either String (Schema VALID))
-> (GQLErrors -> String)
-> GQLErrors
-> Either String (Schema VALID)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GQLErrors -> String
forall b a. (Show a, IsString b) => a -> b
show) Schema VALID -> Either String (Schema VALID)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Result () (Schema VALID) -> Either String (Schema VALID))
-> (ByteString -> Result () (Schema VALID))
-> ByteString
-> Either String (Schema VALID)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Result () (Schema VALID)
parseGQLDocument

parseGQLDocument :: ByteString -> Eventless (Schema VALID)
parseGQLDocument :: ByteString -> Result () (Schema VALID)
parseGQLDocument = Result () (Schema VALID) -> Result () (Schema VALID)
forall e a. Result e a -> Result e a
sortErrors (Result () (Schema VALID) -> Result () (Schema VALID))
-> (ByteString -> Result () (Schema VALID))
-> ByteString
-> Result () (Schema VALID)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Result () (Schema VALID)
parseTypeSystemDefinition

parseFullGQLDocument :: ByteString -> Eventless (Schema VALID)
parseFullGQLDocument :: ByteString -> Result () (Schema VALID)
parseFullGQLDocument = ByteString -> Result () (Schema VALID)
parseGQLDocument (ByteString -> Result () (Schema VALID))
-> (Schema VALID -> Result () (Schema VALID))
-> ByteString
-> Result () (Schema VALID)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> (Schema VALID
forall (s :: Stage). Schema s
internalSchema Schema VALID -> Schema VALID -> Result () (Schema VALID)
forall (m :: * -> *) a. SemigroupM m a => a -> a -> m a
<:>)