azext_iot/monitor/central_validator/validate_schema.py (30 lines of code) (raw):
# coding=utf-8
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
from azext_iot.common.utility import ISO8601Validator
from azext_iot.monitor.central_validator import utils
from azext_iot.monitor.central_validator.validators import enum, geopoint, obj, vector
iso_validator = ISO8601Validator()
validation_function_factory = {
# primitive
"boolean": lambda schema, value: isinstance(value, bool),
"double": lambda schema, value: isinstance(value, (float, int)),
"float": lambda schema, value: isinstance(value, (float, int)),
"integer": lambda schema, value: isinstance(value, int),
"long": lambda schema, value: isinstance(value, (float, int)),
"string": lambda schema, value: isinstance(value, str),
# primitive - time
"date": lambda schema, value: iso_validator.is_iso8601_date(value),
"dateTime": lambda schema, value: iso_validator.is_iso8601_datetime(value),
"duration": lambda schema, value: iso_validator.is_iso8601_duration(value),
"time": lambda schema, value: iso_validator.is_iso8601_time(value),
# pre-defined complex
"geopoint": geopoint.validate,
"vector": vector.validate,
# complex
"Enum": enum.validate,
"Object": obj.validate,
# TODO: yet to be enabled in prod "Map": lambda val: False,
# TODO: yet to be implemented in prod "Array": lambda val: False,
}
def validate(schema, value):
# if theres nothing to validate, then its valid
if value is None:
return True
schema_type = utils.extract_schema_type(schema)
if not schema_type:
return False
validate_function = validation_function_factory.get(schema_type)
# invalid schema type detected
if not validate_function:
return False
return validate_function(schema, value)