{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PolyKinds #-}
module Hercules.API.Name
( Name (..),
uncheckedCast,
)
where
import Control.DeepSeq (NFData)
import Data.Aeson
import Data.Hashable (Hashable (..))
import Data.Proxy
import Data.Swagger
( ToParamSchema (..),
ToSchema (..),
)
import Data.Text (Text)
import GHC.Generics (Generic)
import Web.HttpApiData
import Prelude
-- | A slug. Display names are simply 'Text'.
newtype Name (a :: k) = Name {nameText :: Text}
deriving (Generic, Eq, Ord, NFData)
instance Hashable (Name a)
uncheckedCast :: Name a -> Name b
uncheckedCast (Name s) = Name s
instance Show (Name a) where
showsPrec n = showsPrec n . nameText
instance ToJSON (Name a) where
toEncoding = toEncoding . nameText
toJSON = toJSON . nameText
instance FromJSON (Name a) where
parseJSON = fmap Name . parseJSON
instance ToHttpApiData (Name a) where
toUrlPiece = nameText
instance FromHttpApiData (Name a) where
parseUrlPiece = fmap Name . parseUrlPiece
instance ToSchema (Name a) where
declareNamedSchema = declareNamedSchema . invmap nameText
instance ToParamSchema (Name a) where
toParamSchema = toParamSchema . invmap nameText
invmap :: (a -> b) -> proxy a -> Proxy b
invmap _ _ = Proxy