Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions src/Language/GraphQL/Draft/Syntax.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ module Language.GraphQL.Draft.Syntax
mkName,
unsafeMkName,
litName,
nameQQ,
Description (..),
Value (..),
literal,
Expand Down Expand Up @@ -101,7 +102,8 @@ import {-# SOURCE #-} Language.GraphQL.Draft.Parser
)
import {-# SOURCE #-} Language.GraphQL.Draft.Printer (renderExecutableDoc)
import Language.GraphQL.Draft.Syntax.Internal (liftTypedHashMap)
import Language.Haskell.TH.Syntax (Lift, Q, TExp)
import Language.Haskell.TH.Quote (QuasiQuoter (..))
import Language.Haskell.TH.Syntax (Exp, Lift, Q)
import Language.Haskell.TH.Syntax qualified as TH
import Prettyprinter (Pretty (..))
import Prelude
Expand Down Expand Up @@ -129,8 +131,18 @@ parseName text = maybe (fail errorMessage) pure $ mkName text
where
errorMessage = T.unpack text <> " is not valid GraphQL name"

litName :: Text -> Q (TExp Name)
litName = parseName >=> \name -> [||name||]
-- | Construct a 'Name' value at compile-time.
litName :: Text -> Q Exp
litName = parseName >=> \name -> [|name|]

-- | Construct a 'Name' value at compile-time via quasiquotation.
nameQQ :: QuasiQuoter
nameQQ = QuasiQuoter {quoteExp, quotePat, quoteType, quoteDec}
where
quotePat _ = error "nameQQ does not support quoting patterns"
quoteType _ = error "nameQQ does not support quoting types"
quoteDec _ = error "nameQQ does not support quoting declarations"
quoteExp = litName . T.pack

instance J.FromJSON Name where
parseJSON = J.withText "Name" parseName
Expand Down