def string_expected(values: list, data: dict):
    for v in values:
        if v in data:
            if (not isinstance(data[v], str) and not isinstance(data[v], type(None))):
                raise Exception('string_expected_for_' + v)


def integer_expected(values: list, data: dict):
    for v in values:
        if v in data:
            if (not isinstance(data[v], int) and not isinstance(data[v], type(None))) or isinstance(data[v], bool):
                raise Exception('integer_expected_for_' + v)


def boolean_expected(values: list, data: dict):
    for v in values:
        if v in data:
            if (not isinstance(data[v], bool) and not isinstance(data[v], type(None))):
                raise Exception('boolean_expected_for_' + v)


def array_of_strings_expected(values: list, data: dict):
    for v in values:
        if v in data:
            if (not isinstance(data[v], list) and not isinstance(data[v], type(None))):
                raise Exception('array_expected_for_' + v)
            for i in data[v]:
                if not isinstance(i, str):
                    raise Exception('array_of_strings_expected_for_' + v)


def array_of_integers_expected(values: list, data: dict):
    for v in values:
        if v in data:
            if (not isinstance(data[v], list) and not isinstance(data[v], type(None))):
                raise Exception('array_expected_for_' + v)
            for i in data[v]:
                if not isinstance(i, int):
                    raise Exception('array_of_integers_expected_for_' + v)


def required(values: list, data: dict):
    for v in values:
        if v not in data:
            raise Exception('missing_required_' + v + '_field')