summaryrefslogtreecommitdiff
path: root/Data/GraphQL/AST/Transform.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Data/GraphQL/AST/Transform.hs')
-rw-r--r--Data/GraphQL/AST/Transform.hs18
1 files changed, 14 insertions, 4 deletions
diff --git a/Data/GraphQL/AST/Transform.hs b/Data/GraphQL/AST/Transform.hs
index d4b1150..b08014f 100644
--- a/Data/GraphQL/AST/Transform.hs
+++ b/Data/GraphQL/AST/Transform.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE OverloadedStrings #-}
module Data.GraphQL.AST.Transform where
import Control.Applicative (empty)
@@ -23,13 +24,13 @@ type Fragmenter = Name -> [Core.Field]
-- TODO: Replace Maybe by Either CustomError
document :: Schema.Subs -> Full.Document -> Maybe Core.Document
-document subs defs = operations subs fr ops
+document subs doc = operations subs fr ops
where
(fr, ops) = first foldFrags
. partitionEithers
. NonEmpty.toList
$ defrag subs
- <$> defs
+ <$> doc
foldFrags :: [Fragmenter] -> Fragmenter
foldFrags fs n = getAlt $ foldMap (Alt . ($ n)) fs
@@ -93,8 +94,17 @@ fragmentDefinition subs (Full.FragmentDefinition name _tc _dirs sels) name' =
field :: Schema.Subs -> Fragmenter -> Full.Field -> Maybe Core.Field
field subs fr (Full.Field a n args _dirs sels) =
- Core.Field a n (fold $ argument subs `traverse` args)
- <$> traverse (hush <=< selection subs fr) sels
+ Core.Field a n (fold $ argument subs `traverse` args)
+ -- TODO: hush should error when fragments are not defined in a field
+ <$> traverse (hush <=< selection subs fr) (foldr go empty sels)
+ where
+ go :: Full.Selection -> Full.SelectionSetOpt -> Full.SelectionSetOpt
+ go (Full.SelectionFragmentSpread (Full.FragmentSpread name _dirs)) acc =
+ (Full.SelectionField . full <$> fr name) ++ acc
+ go x acc = x : acc
+
+ full :: Core.Field -> Full.Field
+ full (Core.Field a' n' _args' _sels') = Full.Field a' n' empty empty []
argument :: Schema.Subs -> Full.Argument -> Maybe Core.Argument
argument subs (Full.Argument n v) = Core.Argument n <$> value subs v