#http://docs.graphene-python.org/en/latest/execution/middleware/

"""
Middleware¶

You can use middleware to affect the evaluation of fields in your schema.

A middleware is any object or function that responds to resolve(next_middleware, *args).

Inside that method, it should either:

    Send resolve to the next middleware to continue the evaluation; or
    Return a value to end the evaluation early.

Resolve arguments¶

Middlewares resolve is invoked with several arguments:

    next represents the execution chain. Call next to continue evalution.
    root is the root value object passed throughout the query.
    info is the resolver info.
    args is the dict of arguments passed to the field.

Example¶

This middleware only continues evaluation if the field_name is not 'user'
And then execute it with:
result = schema.execute('THE QUERY', middleware=[AuthorizationMiddleware()])
"""
class AuthorizationMiddleware(object):
    def resolve(self, next, root, info, **args):
        if info.field_name == 'user':
            return None
        return next(root, info, **args)

"""
Functional example¶
Middleware can also be defined as a function. Here we define a middleware that logs the time it takes to resolve each field
"""
from time import time as timer

def timing_middleware(next, root, info, **args):
    start = timer()
    return_value = next(root, info, **args)
    duration = timer() - start
    logger.debug("{parent_type}.{field_name}: {duration} ms".format(
        parent_type=root._meta.name if root and hasattr(root, '_meta') else '',
        field_name=info.field_name,
        duration=round(duration * 1000, 2)
    ))
    return return_value

#And then execute it with:
result = schema.execute('THE QUERY', middleware=[timing_middleware])












