def METHOD_NAME(
    condition_lingo: Lingo,
    providers: Optional[Dict[int, BaseProvider]] = None,
    context: Optional[ContextDict] = None,
    log: Logger = __LOGGER,
) -> Optional[EvalError]:
    """
    Evaluates condition lingo with the give providers and user supplied context.
    If all conditions are satisfied this function returns None.
    # TODO: Evaluate all conditions even if one fails and report the result
    """
    # prevent circular import
    from nucypher.policy.conditions.lingo import ConditionLingo
    # Setup (don't use mutable defaults)
    context = context or dict()
    providers = providers or dict()
    error = None
    # Evaluate
    try:
        if condition_lingo:
            log.info(f"Evaluating access conditions {condition_lingo}")
            lingo = ConditionLingo.from_dict(condition_lingo)
            result = lingo.eval(providers=providers, **context)
            if not result:
                # explicit condition failure
                error = EvalError(
                    "Decryption conditions not satisfied", HTTPStatus.FORBIDDEN
                )
    except ReturnValueEvaluationError as e:
        error = EvalError(
            f"Unable to evaluate return value: {e}",
            HTTPStatus.BAD_REQUEST,
        )
    except InvalidConditionLingo as e:
        error = EvalError(
            f"Invalid condition grammar: {e}",
            HTTPStatus.BAD_REQUEST,
        )
    except InvalidCondition as e:
        error = EvalError(
            f"Incorrect value provided for condition: {e}",
            HTTPStatus.BAD_REQUEST,
        )
    except RequiredContextVariable as e:
        # TODO: be more specific and name the missing inputs, etc
        error = EvalError(f"Missing required inputs: {e}", HTTPStatus.BAD_REQUEST)
    except InvalidContextVariableData as e:
        error = EvalError(
            f"Invalid data provided for context variable: {e}",
            HTTPStatus.BAD_REQUEST,
        )
    except ContextVariableVerificationFailed as e:
        error = EvalError(
            f"Context variable data could not be verified: {e}",
            HTTPStatus.FORBIDDEN,
        )
    except NoConnectionToChain as e:
        error = EvalError(
            f"Node does not have a connection to chain ID {e.chain}",
            HTTPStatus.NOT_IMPLEMENTED,
        )
    except ConditionEvaluationFailed as e:
        error = EvalError(
            f"Decryption condition not evaluated: {e}", HTTPStatus.BAD_REQUEST
        )
    except Exception as e:
        # TODO: Unsure why we ended up here
        message = (
            f"Unexpected exception while evaluating "
            f"decryption condition ({e.__class__.__name__}): {e}"
        )
        error = EvalError(message, HTTPStatus.INTERNAL_SERVER_ERROR)
        log.warn(message)
    if error:
        error = EvalError(*error)
        log.info(error.message)  # log error message
    return error