Group
Extension

Catmandu-PICA/lib/Catmandu/Validator/PICA.pm

package Catmandu::Validator::PICA;
use Catmandu::Sane;
use Catmandu::Util qw(:io :is :check);
use PICA::Schema;
use Moo;

our $VERSION = '1.18';

with qw(Catmandu::Validator);

has schema => (
    is => 'ro',
    required => 1,
    trigger => sub {
        my ($self, $schema) = @_;
        unless (is_instance($schema, 'PICA::Schema')) {
            if (is_string($schema)) {
                if ($schema =~ /\.y.?ml/) {
                    $schema = read_yaml($schema);
                } else {
                    $schema = read_json($schema);
                }
            }
            $self->{schema} = PICA::Schema->new(check_hash_ref($schema));
        }
    }
);

has ignore_unknown_fields      => ( is => 'ro' );
has ignore_unknown_subfields   => ( is => 'ro' );
has ignore_unknown             => ( is => 'ro' );
has allow_deprecated_fields    => ( is => 'ro' );
has allow_deprecated_subfields => ( is => 'ro' );
has allow_deprecated_codes     => ( is => 'ro' );
has allow_deprecated           => ( is => 'ro' );
has ignore_subfield_order      => ( is => 'ro' );
has ignore_subfields           => ( is => 'ro' );

has options => (
    is => 'ro',
    init_arg => undef,
    builder => sub {
        return {
            ignore_unknown_fields      => $_[0]->ignore_unknown_fields,
            ignore_unknown_subfields   => $_[0]->ignore_unknown_subfields,
            ignore_unknown             => $_[0]->ignore_unknown,
            allow_deprecated_fields    => $_[0]->allow_deprecated_fields,
            allow_deprecated_subfields => $_[0]->allow_deprecated_subfields,
            allow_deprecated_codes     => $_[0]->allow_deprecated_codes,
            allow_deprecated           => $_[0]->allow_deprecated,
            ignore_subfield_order      => $_[0]->ignore_subfield_order,
            ignore_subfields           => $_[0]->ignore_subfields,
        }
    },
);

sub validate_data {
    my ($self, $record) = @_;

    my @errors = $self->{schema}->check($record, %{$self->options});

    return @errors ? \@errors : undef;
}

1;
__END__

=head1 NAME

Catmandu::Validator::PICA - Validate PICA+ records with an Avram Schema

=head1 SYNOPSIS

In Perl code:

    use Catmandu::Validator::PICA;
    use Catmandu qw(importer);

    my $validator = Catmandu::Validator::PICA->new( schema => 'schema.json' );

    importer('PICA', file => 'pica.xml')->each( sub {
        my $record = shift;
        unless($validator->validate($record)){
            say "$_" for @{$validator->last_errors()};
        }
    });

In Catmandu Fix language:

    # reject all items not conforming to the schema
    select valid('', PICA, schema: 'schema.json')

=head1 DESCRIPTION

This L<Catmandu::Validator> can be used to check PICA+ records against an
L<Avram Schema language|https://format.gbv.de/schema/avram/specification>.

See also L<Catmandu::Fix::validate>, and L<Catmandu::Fix::Condition::valid> for
usage of validators in Catmandu Fix language.

=head1 CONFIGURATION

=over

=item schema

Avram Schema given as hash reference, filename (JSON or YAML), or instance of
L<PICA::Schema>.

=item ignore_unknown_fields

Don't report fields not included in the schema.

=item ignore_unknown_subfields

Don't report subfields not included in the schema.

=item ignore_unknown

Don't report fields and subfields not included in the schema.

=item allow_deprecated_fields

Don't report deprecated fields.

=item allow_deprecated_subfields

Don't report deprecated subfields.

=item allow_deprecated_codes

Don't report deprecated codes.

=item allow_deprecated

Don't report deprecated fields, subfields, and codes.

=item ignore_subfield_order

Don't report errors resulting on wrong subfield order.

=item ignore_subfields

Don't check subfields at all.

=back

=cut


Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.