public static function realParse()

in lang/php/lib/Schema/AvroSchema.php [297:389]


    public static function realParse($avro, $default_namespace = null, &$schemata = null)
    {
        if (is_null($schemata)) {
            $schemata = new AvroNamedSchemata();
        }

        if (is_array($avro)) {
            $type = $avro[self::TYPE_ATTR] ?? null;

            if (self::isPrimitiveType($type)) {
                return new AvroPrimitiveSchema($type);
            }

            if (self::isNamedType($type)) {
                $name = $avro[self::NAME_ATTR] ?? null;
                $namespace = $avro[self::NAMESPACE_ATTR] ?? null;
                $new_name = new AvroName($name, $namespace, $default_namespace);
                $doc = $avro[self::DOC_ATTR] ?? null;
                $aliases = $avro[self::ALIASES_ATTR] ?? null;
                switch ($type) {
                    case self::FIXED_SCHEMA:
                        $size = $avro[self::SIZE_ATTR] ?? null;
                        return new AvroFixedSchema(
                            $new_name,
                            $doc,
                            $size,
                            $schemata,
                            $aliases
                        );
                    case self::ENUM_SCHEMA:
                        $symbols = $avro[self::SYMBOLS_ATTR] ?? null;
                        return new AvroEnumSchema(
                            $new_name,
                            $doc,
                            $symbols,
                            $schemata,
                            $aliases
                        );
                    case self::RECORD_SCHEMA:
                    case self::ERROR_SCHEMA:
                        $fields = $avro[self::FIELDS_ATTR] ?? null;
                        return new AvroRecordSchema(
                            $new_name,
                            $doc,
                            $fields,
                            $schemata,
                            $type,
                            $aliases
                        );
                    default:
                        throw new AvroSchemaParseException(sprintf('Unknown named type: %s', $type));
                }
            } elseif (self::isValidType($type)) {
                switch ($type) {
                    case self::ARRAY_SCHEMA:
                        return new AvroArraySchema(
                            $avro[self::ITEMS_ATTR],
                            $default_namespace,
                            $schemata
                        );
                    case self::MAP_SCHEMA:
                        return new AvroMapSchema(
                            $avro[self::VALUES_ATTR],
                            $default_namespace,
                            $schemata
                        );
                    default:
                        throw new AvroSchemaParseException(
                            sprintf('Unknown valid type: %s', $type)
                        );
                }
            } elseif (
                !array_key_exists(self::TYPE_ATTR, $avro)
                && AvroUtil::isList($avro)
            ) {
                return new AvroUnionSchema($avro, $default_namespace, $schemata);
            } else {
                throw new AvroSchemaParseException(sprintf(
                    'Undefined type: %s',
                    $type
                ));
            }
        } elseif (self::isPrimitiveType($avro)) {
            return new AvroPrimitiveSchema($avro);
        } else {
            throw new AvroSchemaParseException(
                sprintf(
                    '%s is not a schema we know about.',
                    print_r($avro, true)
                )
            );
        }
    }