packages feed

mu-graphql 0.5.0.1 → 0.5.0.2

raw patch · 2 files changed

+44/−12 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

mu-graphql.cabal view
@@ -1,5 +1,5 @@ name:          mu-graphql-version:       0.5.0.1+version:       0.5.0.2 synopsis:      GraphQL support for Mu description:   GraphQL servers and clients for Mu-Haskell cabal-version: >=1.10
src/Mu/GraphQL/Query/Parse.hs view
@@ -270,7 +270,7 @@  class ParseQuery (p :: Package') (s :: Symbol) where   parseQuery-    :: ( MonadError T.Text f, p ~ 'Package pname ss )+    :: ( MonadError T.Text f, p ~ 'Package pname ss, KnownName s )     => Proxy p -> Proxy s     -> VariableMap -> FragmentMap -> [GQL.Selection]     -> f (ServiceQuery p (LookupService ss s))@@ -307,10 +307,34 @@          , ParseQueryOneOf p ss)          => ParseQueryOneOf p (s ': ss) where   parseQueryOneOf pp _ps vmap frmap sel-    = (:*) <$> (ChosenOneOfQuery (Proxy @s) <$> parseQuery pp (Proxy @s) vmap frmap sel)-           <*> parseQueryOneOf pp (Proxy @ss) vmap frmap sel+    = do refinedSel <- refineSelection sel+         parsedQ    <- parseQuery pp (Proxy @s) vmap frmap refinedSel+         restQ      <- parseQueryOneOf pp (Proxy @ss) vmap frmap sel+         pure (ChosenOneOfQuery (Proxy @s) parsedQ :* restQ)+    where+      -- refineSelection :: [GQL.Selection] -> f [GQL.Selection]+      refineSelection [] = pure []+      refineSelection (f@GQL.FieldSelection {} : rest)+        = (f :) <$> refineSelection rest+      refineSelection (GQL.InlineFragmentSelection (GQL.InlineFragment ty dirs innerSs _) : rest)+        | any (shouldSkip vmap) dirs+        = refineSelection rest+        | Nothing <- ty+        = (++) <$> refineSelection (F.toList innerSs) <*> refineSelection rest+        | Just selectedTy <- ty, selectedTy == T.pack (nameVal (Proxy @s))+        = (++) <$> refineSelection (F.toList innerSs) <*> refineSelection rest+        | otherwise+        = refineSelection rest+      refineSelection (GQL.FragmentSpreadSelection (GQL.FragmentSpread nm dirs _) : rest)+        | any (shouldSkip vmap) dirs+        = refineSelection rest+        | Just (GQL.FragmentDefinition _ fTy fDirs fSel fLoc) <- HM.lookup nm frmap+        = refineSelection (GQL.InlineFragmentSelection (GQL.InlineFragment (Just fTy) fDirs fSel fLoc) : rest)+        | otherwise  -- the fragment definition was not found+        = throwError $ "fragment '" <> nm <> "' was not found" -instance ( ParseMethod p ('Service s methods) methods )++instance ( ParseMethod p ('Service s methods) methods, KnownName s )          => ParseQuery' p s ('Service s methods) where   parseQuery' _pp _ps _psvc vmap frmap fs = ServiceQuery <$> go fs     where@@ -318,14 +342,22 @@       go (GQL.FieldSelection fld : ss)             = (++) <$> (maybeToList <$> fieldToMethod fld) <*> go ss       go (GQL.FragmentSpreadSelection (GQL.FragmentSpread nm dirs _) : ss)-        | Just fr <- HM.lookup nm frmap-        = if not (any (shouldSkip vmap) dirs) && not (any (shouldSkip vmap) $ fdDirectives fr)-            then (++) <$> go (fdSelectionSet fr) <*> go ss-            else go ss+        | any (shouldSkip vmap) dirs+        = go ss+        | Just (GQL.FragmentDefinition _ fTy fDirs fSel fLoc) <- HM.lookup nm frmap+        = go (GQL.InlineFragmentSelection (GQL.InlineFragment (Just fTy) fDirs fSel fLoc) : ss)         | otherwise  -- the fragment definition was not found         = throwError $ "fragment '" <> nm <> "' was not found"-      go (_ : _)  -- Inline fragments are not yet supported-        = throwError "inline fragments are not (yet) supported"+      go (GQL.InlineFragmentSelection (GQL.InlineFragment ty dirs innerSs _) : ss)+        | any (shouldSkip vmap) dirs+        = go ss+        | Nothing <- ty+        = go (F.toList innerSs ++ ss)+        | Just selectedTy <- ty+        = let thisTy = T.pack (nameVal (Proxy @s))+          in if selectedTy == thisTy+             then go (F.toList innerSs ++ ss)+             else throwError $ "fragment for '" <> selectedTy <> "' used in '" <> thisTy <> "'"       -- fieldToMethod :: GQL.Field -> f (Maybe (OneMethodQuery p ('Service sname methods)))       fieldToMethod f@(GQL.Field alias name args dirs sels _)         | any (shouldSkip vmap) dirs@@ -757,7 +789,7 @@          => ParseReturn p ('OptionalRef r) where   parseReturn vmap frmap fname s     = RetOptional <$> parseReturn vmap frmap fname s-instance ( p ~ 'Package pname ss, ParseQuery p s )+instance ( p ~ 'Package pname ss, ParseQuery p s, KnownName s )          => ParseReturn p ('ObjectRef s) where   parseReturn vmap frmap _ s     = RetObject <$> parseQuery (Proxy @p) (Proxy @s) vmap frmap s