{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TemplateHaskell #-}
module Data.Aeson.Schema.Utils.NameLike
( NameLike(..)
, fromName
, resolveName
) where
import Data.Text (Text)
import Language.Haskell.TH.Syntax (Name, Q, lookupTypeName, nameBase)
data NameLike = NameRef String | NameTH Name
instance Eq NameLike where
ty1 == ty2 = fromName ty1 == fromName ty2
instance Show NameLike where
show = show . fromName
fromName :: NameLike -> String
fromName = \case
NameRef s -> s
NameTH name -> nameBase name
resolveName :: NameLike -> Q Name
resolveName = \case
NameRef "Bool" -> pure ''Bool
NameRef "Int" -> pure ''Int
NameRef "Double" -> pure ''Double
NameRef "Text" -> pure ''Text
NameRef name -> lookupTypeName name >>= maybe (fail $ "Unknown type: " ++ name) pure
NameTH name -> pure name