packages feed

evoke-0.2022.8.26: source/library/Evoke/Type/Field.hs

module Evoke.Type.Field
  ( Field (..),
    make,
    isOptional,
  )
where

import qualified Evoke.Hsc as Hsc
import qualified GHC.Hs as Ghc
import qualified GHC.Plugins as Ghc

data Field = Field
  { name :: Ghc.OccName,
    type_ :: Ghc.HsType Ghc.GhcPs
  }

make ::
  Ghc.SrcSpan ->
  Ghc.LHsType Ghc.GhcPs ->
  Ghc.LFieldOcc Ghc.GhcPs ->
  Ghc.Hsc Field
make srcSpan lHsType lFieldOcc = do
  lRdrName <- case Ghc.unLoc lFieldOcc of
    Ghc.FieldOcc _ x -> pure x
  occName <- case Ghc.unLoc lRdrName of
    Ghc.Unqual x -> pure x
    _ -> Hsc.throwError srcSpan $ Ghc.text "unsupported RdrName"
  pure Field {name = occName, type_ = Ghc.unLoc lHsType}

isOptional :: Field -> Bool
isOptional field = case type_ field of
  Ghc.HsAppTy _ lHsType _ -> case Ghc.unLoc lHsType of
    Ghc.HsTyVar _ _ lIdP -> case Ghc.unLoc lIdP of
      Ghc.Unqual occName -> Ghc.occNameString occName == "Maybe"
      _ -> False
    _ -> False
  _ -> False