{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Server.Types.Internal
  ( TypeData (..),
    mkTypeData,
    stripConstructorNamespace,
    stripFieldNamespace,
  )
where

-- MORPHEUS

import Data.Char (toLower)
import Data.Morpheus.Server.Types.TypeName (TypeFingerprint (..))
import Data.Morpheus.Types.Internal.AST
  ( TypeName,
    TypeWrapper (..),
    mkBaseType,
  )
import Data.Text (length)
import Relude hiding (Seq, Undefined, intercalate, length)

data TypeData = TypeData
  { TypeData -> TypeName
gqlTypeName :: TypeName,
    TypeData -> TypeWrapper
gqlWrappers :: TypeWrapper,
    TypeData -> TypeFingerprint
gqlFingerprint :: TypeFingerprint
  }
  deriving (Int -> TypeData -> ShowS
[TypeData] -> ShowS
TypeData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TypeData] -> ShowS
$cshowList :: [TypeData] -> ShowS
show :: TypeData -> String
$cshow :: TypeData -> String
showsPrec :: Int -> TypeData -> ShowS
$cshowsPrec :: Int -> TypeData -> ShowS
Show)

mkTypeData :: TypeName -> a -> TypeData
mkTypeData :: forall a. TypeName -> a -> TypeData
mkTypeData TypeName
name a
_ =
  TypeData
    { gqlTypeName :: TypeName
gqlTypeName = TypeName
name,
      gqlFingerprint :: TypeFingerprint
gqlFingerprint = TypeName -> TypeFingerprint
InternalFingerprint TypeName
name,
      gqlWrappers :: TypeWrapper
gqlWrappers = TypeWrapper
mkBaseType
    }

dropPrefix :: Text -> String -> String
dropPrefix :: Text -> ShowS
dropPrefix Text
name = forall a. Int -> [a] -> [a]
drop (Text -> Int
length Text
name)

stripConstructorNamespace :: Text -> String -> String
stripConstructorNamespace :: Text -> ShowS
stripConstructorNamespace = Text -> ShowS
dropPrefix

stripFieldNamespace :: Text -> String -> String
stripFieldNamespace :: Text -> ShowS
stripFieldNamespace Text
prefix = ShowS
__uncapitalize forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ShowS
dropPrefix Text
prefix
  where
    __uncapitalize :: ShowS
__uncapitalize [] = []
    __uncapitalize (Char
x : String
xs) = Char -> Char
toLower Char
x forall a. a -> [a] -> [a]
: String
xs