import functools

import flask
from werkzeug.local import LocalProxy


class InputValidationException(Exception):
    pass


class Blueprint(flask.Blueprint):
    logger = LocalProxy(lambda: flask.current_app.logger)

    def route(self, route, **options):
        parent_function_wrapper = super().route(route, **options)

        def newFunctionWrapper(func):
            @functools.wraps(func)
            def newFunction():
                try:
                    result = func()
                except InputValidationException as e:
                    self.logger.error(e)
                    return {
                        'Err': e.args[0],
                    }
                return result

            return parent_function_wrapper(newFunction)

        return newFunctionWrapper


app = Blueprint('Plugin', __name__)

functions = []


@app.route('/Plugin.Activate', methods=['POST'])
def Activate():
    return {
        'Implements': functions,
    }


__all__ = ['InputValidationException', 'Blueprint', 'app', 'functions']

import functools

import flask
from werkzeug.local import LocalProxy


class InputValidationException(Exception):
    pass


class Blueprint(flask.Blueprint):
    logger = LocalProxy(lambda: flask.current_app.logger)

    def route(self, route, **options):
        parent_function_wrapper = super().route(route, **options)

        def newFunctionWrapper(func):
            @functools.wraps(func)
            def newFunction():
                try:
                    result = func()
                except InputValidationException as e:
                    self.logger.error(e)
                    return {
                        'Err': e.args[0],
                    }
                return result

            return parent_function_wrapper(newFunction)

        return newFunctionWrapper


app = Blueprint('Plugin', __name__)

functions = []


@app.route('/Plugin.Activate', methods=['POST'])
def Activate():
    return {
        'Implements': functions,
    }


__all__ = ['InputValidationException', 'Blueprint', 'app', 'functions']
