from flask import Request as _Request
from flask import current_app as app

from ereuse_devicehub.teal.resource import Schema


class Request(_Request):
    def get_json(
        self,
        force=False,
        silent=False,
        cache=True,
        validate=True,
        schema: Schema = None,
    ) -> dict:
        """
        As :meth:`flask.Request.get_json` but parsing
        the resulting json through passed-in ``schema`` (or by default
        ``g.schema``).
        """
        json = super().get_json(force, silent, cache)
        if validate:
            json = (
                schema.load(json)
                if schema
                else app.resources[self.blueprint].schema.load(json)
            )
        return json