Avro
view release on metacpan or search on metacpan
lib/Avro/Schema.pm view on Meta::CPAN
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
package Avro::Schema;
use strict;
use warnings;
use Carp;
use JSON::MaybeXS ();
use Try::Tiny;
our $VERSION = '++MODULE_VERSION++';
my $json = JSON::MaybeXS->new->allow_nonref;
sub parse {
my $schema = shift;
my $json_string = shift;
my $names = shift || {};
my $namespace = shift || "";
my $struct = try {
$json->decode($json_string);
}
catch {
throw Avro::Schema::Error::Parse(
"Cannot parse json string: $_"
);
};
return $schema->parse_struct($struct, $names, $namespace);
}
sub to_string {
my $class = shift;
my $struct = shift;
return $json->encode($struct);
}
sub parse_struct {
my $schema = shift;
my $struct = shift;
my $names = shift || {};
my $namespace = shift || "";
## 1.3.2 A JSON object
if (ref $struct eq 'HASH') {
my $type = $struct->{type}
or throw Avro::Schema::Error::Parse("type is missing");
if ( Avro::Schema::Primitive->is_type_valid($type) ) {
return Avro::Schema::Primitive->new(type => $type);
}
## XXX technically we shouldn't allow error type other than in
## a Protocol definition
if ($type eq 'record' or $type eq 'error') {
return Avro::Schema::Record->new(
struct => $struct,
names => $names,
namespace => $namespace,
);
}
elsif ($type eq 'enum') {
return Avro::Schema::Enum->new(
struct => $struct,
names => $names,
namespace => $namespace,
);
}
elsif ($type eq 'array') {
return Avro::Schema::Array->new(
struct => $struct,
( run in 2.597 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )