in lang/php/lib/Schema/AvroSchema.php [453:524]
public static function isValidDatum($expected_schema, $datum)
{
switch ($expected_schema->type) {
case self::NULL_TYPE:
return is_null($datum);
case self::BOOLEAN_TYPE:
return is_bool($datum);
case self::STRING_TYPE:
case self::BYTES_TYPE:
return is_string($datum);
case self::INT_TYPE:
return (is_int($datum)
&& (self::INT_MIN_VALUE <= $datum)
&& ($datum <= self::INT_MAX_VALUE));
case self::LONG_TYPE:
return (is_int($datum)
&& (self::LONG_MIN_VALUE <= $datum)
&& ($datum <= self::LONG_MAX_VALUE));
case self::FLOAT_TYPE:
case self::DOUBLE_TYPE:
return (is_float($datum) || is_int($datum));
case self::ARRAY_SCHEMA:
if (is_array($datum)) {
foreach ($datum as $d) {
if (!self::isValidDatum($expected_schema->items(), $d)) {
return false;
}
}
return true;
}
return false;
case self::MAP_SCHEMA:
if (is_array($datum)) {
foreach ($datum as $k => $v) {
if (
!is_string($k)
|| !self::isValidDatum($expected_schema->values(), $v)
) {
return false;
}
}
return true;
}
return false;
case self::UNION_SCHEMA:
foreach ($expected_schema->schemas() as $schema) {
if (self::isValidDatum($schema, $datum)) {
return true;
}
}
return false;
case self::ENUM_SCHEMA:
return in_array($datum, $expected_schema->symbols());
case self::FIXED_SCHEMA:
return (is_string($datum)
&& (strlen($datum) == $expected_schema->size()));
case self::RECORD_SCHEMA:
case self::ERROR_SCHEMA:
case self::REQUEST_SCHEMA:
if (is_array($datum)) {
foreach ($expected_schema->fields() as $field) {
if (!self::isValidDatum($field->type(), $datum[$field->name()] ?? null)) {
return false;
}
}
return true;
}
return false;
default:
throw new AvroSchemaParseException(sprintf('%s is not allowed.', $expected_schema));
}
}