forked from OSS/graphql
		
	Add a reader instance to the resolvers
The Reader contains a Name/Value hashmap, which will contain resolver arguments.
This commit is contained in:
		
							
								
								
									
										15
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -14,6 +14,8 @@ All notable changes to this project will be documented in this file.
 | 
				
			|||||||
- `Language.GraphQL.AST.Transform` is isn't exposed publically anymore.
 | 
					- `Language.GraphQL.AST.Transform` is isn't exposed publically anymore.
 | 
				
			||||||
- `Language.GraphQL.Schema.resolve` accepts a selection `Seq` (`Data.Sequence`)
 | 
					- `Language.GraphQL.Schema.resolve` accepts a selection `Seq` (`Data.Sequence`)
 | 
				
			||||||
  instead of a list. Selections are stored as sequences internally as well.
 | 
					  instead of a list. Selections are stored as sequences internally as well.
 | 
				
			||||||
 | 
					- Add a reader instance to the resolver's monad stack. The Reader contains
 | 
				
			||||||
 | 
					  a Name/Value hashmap, which will contain resolver arguments.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Added
 | 
					### Added
 | 
				
			||||||
- Nested fragment support.
 | 
					- Nested fragment support.
 | 
				
			||||||
@@ -29,6 +31,19 @@ All notable changes to this project will be documented in this file.
 | 
				
			|||||||
- `Language.GraphQL.AST.Parser.type_`: Try type parsers in a variable
 | 
					- `Language.GraphQL.AST.Parser.type_`: Try type parsers in a variable
 | 
				
			||||||
  definition in a different order to avoid using `but`.
 | 
					  definition in a different order to avoid using `but`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Removed
 | 
				
			||||||
 | 
					- `Language.GraphQL.AST.Arguments`. Use `[Language.GraphQL.AST.Argument]`
 | 
				
			||||||
 | 
					  instead.
 | 
				
			||||||
 | 
					- `Language.GraphQL.AST.Directives`. Use `[Language.GraphQL.AST.Directives]`
 | 
				
			||||||
 | 
					  instead.
 | 
				
			||||||
 | 
					- `Language.GraphQL.AST.VariableDefinitions`. Use
 | 
				
			||||||
 | 
					  `[Language.GraphQL.AST.VariableDefinition]` instead.
 | 
				
			||||||
 | 
					- `Language.GraphQL.AST.FragmentName`. Use `Language.GraphQL.AST.Name` instead.
 | 
				
			||||||
 | 
					- `Language.GraphQL.Execute.Schema` - It was a resolver list, not a schema.
 | 
				
			||||||
 | 
					- `Language.GraphQL.Schema`: `enum`, `enumA`, `wrappedEnum` and `wrappedEnumA`.
 | 
				
			||||||
 | 
					  Use `scalar`, `scalarA`, `wrappedScalar` and `wrappedScalarA` instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [0.5.1.0] - 2019-10-22
 | 
					## [0.5.1.0] - 2019-10-22
 | 
				
			||||||
### Deprecated
 | 
					### Deprecated
 | 
				
			||||||
- `Language.GraphQL.AST.Arguments`. Use `[Language.GraphQL.AST.Argument]`
 | 
					- `Language.GraphQL.AST.Arguments`. Use `[Language.GraphQL.AST.Argument]`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,10 +23,10 @@ import Data.Text.Lazy.Builder.Int (decimal)
 | 
				
			|||||||
import Data.Text.Lazy.Builder.RealFloat (realFloat)
 | 
					import Data.Text.Lazy.Builder.RealFloat (realFloat)
 | 
				
			||||||
import qualified Language.GraphQL.AST as Full
 | 
					import qualified Language.GraphQL.AST as Full
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- | Instructs the encoder whether a GraphQL should be minified or pretty
 | 
					-- | Instructs the encoder whether the GraphQL document should be minified or
 | 
				
			||||||
--   printed.
 | 
					--   pretty printed.
 | 
				
			||||||
--
 | 
					--
 | 
				
			||||||
--   Use 'pretty' and 'minified' to construct the formatter.
 | 
					--   Use 'pretty' or 'minified' to construct the formatter.
 | 
				
			||||||
data Formatter
 | 
					data Formatter
 | 
				
			||||||
    = Minified
 | 
					    = Minified
 | 
				
			||||||
    | Pretty Word
 | 
					    | Pretty Word
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,7 @@ module Language.GraphQL.Schema
 | 
				
			|||||||
import Control.Monad.IO.Class (MonadIO(..))
 | 
					import Control.Monad.IO.Class (MonadIO(..))
 | 
				
			||||||
import Control.Monad.Trans.Class (lift)
 | 
					import Control.Monad.Trans.Class (lift)
 | 
				
			||||||
import Control.Monad.Trans.Except (runExceptT)
 | 
					import Control.Monad.Trans.Except (runExceptT)
 | 
				
			||||||
 | 
					import Control.Monad.Trans.Reader (runReaderT)
 | 
				
			||||||
import Data.Foldable (find, fold)
 | 
					import Data.Foldable (find, fold)
 | 
				
			||||||
import Data.Maybe (fromMaybe)
 | 
					import Data.Maybe (fromMaybe)
 | 
				
			||||||
import qualified Data.Aeson as Aeson
 | 
					import qualified Data.Aeson as Aeson
 | 
				
			||||||
@@ -102,9 +103,10 @@ resolveFieldValue :: MonadIO m
 | 
				
			|||||||
    -> Field
 | 
					    -> Field
 | 
				
			||||||
    -> CollectErrsT m (HashMap Text Aeson.Value)
 | 
					    -> CollectErrsT m (HashMap Text Aeson.Value)
 | 
				
			||||||
resolveFieldValue f resolveRight fld@(Field _ _ args _) = do
 | 
					resolveFieldValue f resolveRight fld@(Field _ _ args _) = do
 | 
				
			||||||
    result <- lift $ runExceptT . runActionT $ f args
 | 
					    result <- lift $ reader . runExceptT . runActionT $ f args
 | 
				
			||||||
    either resolveLeft (resolveRight fld) result
 | 
					    either resolveLeft (resolveRight fld) result
 | 
				
			||||||
      where
 | 
					      where
 | 
				
			||||||
 | 
					        reader = flip runReaderT $ Context mempty
 | 
				
			||||||
        resolveLeft err = do
 | 
					        resolveLeft err = do
 | 
				
			||||||
            _ <- addErrMsg err
 | 
					            _ <- addErrMsg err
 | 
				
			||||||
            return $ HashMap.singleton (aliasOrName fld) Aeson.Null
 | 
					            return $ HashMap.singleton (aliasOrName fld) Aeson.Null
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
-- | Monad transformer stack used by the @GraphQL@ resolvers.
 | 
					-- | Monad transformer stack used by the @GraphQL@ resolvers.
 | 
				
			||||||
module Language.GraphQL.Trans
 | 
					module Language.GraphQL.Trans
 | 
				
			||||||
    ( ActionT(..)
 | 
					    ( ActionT(..)
 | 
				
			||||||
 | 
					    , Context(Context)
 | 
				
			||||||
    ) where
 | 
					    ) where
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Control.Applicative (Alternative(..))
 | 
					import Control.Applicative (Alternative(..))
 | 
				
			||||||
@@ -8,10 +9,19 @@ import Control.Monad (MonadPlus(..))
 | 
				
			|||||||
import Control.Monad.IO.Class (MonadIO(..))
 | 
					import Control.Monad.IO.Class (MonadIO(..))
 | 
				
			||||||
import Control.Monad.Trans.Class (MonadTrans(..))
 | 
					import Control.Monad.Trans.Class (MonadTrans(..))
 | 
				
			||||||
import Control.Monad.Trans.Except (ExceptT)
 | 
					import Control.Monad.Trans.Except (ExceptT)
 | 
				
			||||||
 | 
					import Control.Monad.Trans.Reader (ReaderT)
 | 
				
			||||||
 | 
					import Data.HashMap.Strict (HashMap)
 | 
				
			||||||
import Data.Text (Text)
 | 
					import Data.Text (Text)
 | 
				
			||||||
 | 
					import Language.GraphQL.AST.Core (Name, Value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- | Monad transformer stack used by the resolvers to provide error handling.
 | 
					-- | Resolution context holds resolver arguments.
 | 
				
			||||||
newtype ActionT m a = ActionT { runActionT :: ExceptT Text m a }
 | 
					newtype Context = Context (HashMap Name Value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- | Monad transformer stack used by the resolvers to provide error handling
 | 
				
			||||||
 | 
					--   and resolution context (resolver arguments).
 | 
				
			||||||
 | 
					newtype ActionT m a = ActionT
 | 
				
			||||||
 | 
					    { runActionT :: ExceptT Text (ReaderT Context m) a
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
instance Functor m => Functor (ActionT m) where
 | 
					instance Functor m => Functor (ActionT m) where
 | 
				
			||||||
    fmap f = ActionT . fmap f . runActionT
 | 
					    fmap f = ActionT . fmap f . runActionT
 | 
				
			||||||
@@ -25,7 +35,7 @@ instance Monad m => Monad (ActionT m) where
 | 
				
			|||||||
    (ActionT action) >>= f = ActionT $ action >>= runActionT . f
 | 
					    (ActionT action) >>= f = ActionT $ action >>= runActionT . f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
instance MonadTrans ActionT where
 | 
					instance MonadTrans ActionT where
 | 
				
			||||||
    lift = ActionT . lift
 | 
					    lift = ActionT . lift . lift
 | 
				
			||||||
 | 
					
 | 
				
			||||||
instance MonadIO m => MonadIO (ActionT m) where
 | 
					instance MonadIO m => MonadIO (ActionT m) where
 | 
				
			||||||
    liftIO = lift . liftIO
 | 
					    liftIO = lift . liftIO
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user