{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Server.Types.Visitors
  ( VisitType (..),
    VisitField (..),
    VisitEnum (..),
  )
where

import Data.Morpheus.Types.Internal.AST (CONST, Value)
import Relude

class VisitType a where
  -- | Construct a new type name depending on whether it is an input,
  -- and being given the original type name.
  visitTypeName :: a -> Bool -> Text -> Text
  visitTypeName a
_ Bool
_ = forall a. a -> a
id

  visitTypeDescription :: a -> Maybe Text -> Maybe Text
  visitTypeDescription = forall a b. a -> b -> a
const forall a. a -> a
id

  -- | Function applied to field labels.
  -- Handy for removing common record prefixes for example.
  visitFieldNames :: a -> Text -> Text
  visitFieldNames a
_ = forall a. a -> a
id

  -- | Function applied to enum values
  -- Handy for removing common enum prefixes for example.
  visitEnumNames :: a -> Text -> Text
  visitEnumNames a
_ = forall a. a -> a
id

class VisitField a where
  visitFieldName :: a -> Text -> Text
  visitFieldName a
_ = forall a. a -> a
id

  visitFieldDescription :: a -> Maybe Text -> Maybe Text
  visitFieldDescription a
_ = forall a. a -> a
id

  visitFieldDefaultValue :: a -> Maybe (Value CONST) -> Maybe (Value CONST)
  visitFieldDefaultValue a
_ = forall a. a -> a
id

class VisitEnum a where
  visitEnumName :: a -> Text -> Text
  visitEnumName a
_ = forall a. a -> a
id

  visitEnumDescription :: a -> Maybe Text -> Maybe Text
  visitEnumDescription a
_ = forall a. a -> a
id