App-ZodiacUtils
view release on metacpan or search on metacpan
script/_zodiac-of view on Meta::CPAN
#
#Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Normalize>.
#
#=head1 SOURCE
#
#Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Normalize>.
#
#=head1 BUGS
#
#Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Normalize>
#
#When submitting a bug or request, please include a test-file or a
#patch to an existing test-file that illustrates the bug or desired
#feature.
#
#=head1 SEE ALSO
#
#L<Sah>, L<Data::Sah>
#
#=head1 AUTHOR
#
#perlancar <perlancar@cpan.org>
#
#=head1 COPYRIGHT AND LICENSE
#
#This software is copyright (c) 2018, 2015, 2014 by perlancar@cpan.org.
#
#This is free software; you can redistribute it and/or modify it under
#the same terms as the Perl 5 programming language system itself.
#
#=cut
### Data/Sah/Resolve.pm ###
#package Data::Sah::Resolve;
#
#our $DATE = '2017-04-19'; # DATE
#our $VERSION = '0.007'; # VERSION
#
#use 5.010001;
#use strict;
#use warnings;
#
#use Exporter qw(import);
#our @EXPORT_OK = qw(resolve_schema);
#
#sub _resolve {
# my ($opts, $type, $clsets, $seen) = @_;
#
# die "Recursive schema definition: ".join(" -> ", @$seen, $type)
# if grep { $type eq $_ } @$seen;
# push @$seen, $type;
#
# (my $typemod_pm = "Data/Sah/Type/$type.pm") =~ s!::!/!g;
# eval { require $typemod_pm; 1 };
# my $err = $@;
# # already a builtin-type, so just return the schema's type name & clause set
# return [$type, $clsets] unless $err;
# die "Can't check whether $type is a builtin Sah type: $err"
# unless $err =~ /\ACan't locate/;
#
# # not a type, try a schema under Sah::Schema
# my $schmod = "Sah::Schema::$type";
# (my $schmod_pm = "$schmod.pm") =~ s!::!/!g;
# eval { require $schmod_pm; 1 };
# die "Not a known built-in Sah type '$type' (can't locate ".
# "Data::Sah::Type::$type) and not a known schema name '$type' ($@)"
# if $@;
# no strict 'refs';
# my $sch2 = ${"$schmod\::schema"};
# die "BUG: Schema module $schmod doesn't contain \$schema" unless $sch2;
# unshift @$clsets, $sch2->[1];
# _resolve($opts, $sch2->[0], $clsets, $seen);
#}
#
#sub resolve_schema {
# my $opts = ref($_[0]) eq 'HASH' ? shift : {};
# my $sch = shift;
#
# unless ($opts->{schema_is_normalized}) {
# require Data::Sah::Normalize;
# $sch = Data::Sah::Normalize::normalize_schema($sch);
# }
# $opts->{merge_clause_sets} //= 1;
#
# my $seen = [];
# my $res = _resolve($opts, $sch->[0], keys(%{$sch->[1]}) ? [$sch->[1]] : [], $seen);
#
# MERGE:
# {
# last unless $opts->{merge_clause_sets};
# last if @{ $res->[1] } < 2;
#
# my @clsets = (shift @{ $res->[1] });
# for my $clset (@{ $res->[1] }) {
# my $has_merge_mode_keys;
# for (keys %$clset) {
# if (/\Amerge\./) {
# $has_merge_mode_keys = 1;
# last;
# }
# }
# if ($has_merge_mode_keys) {
# state $merger = do {
# require Data::ModeMerge;
# my $mm = Data::ModeMerge->new(config => {
# recurse_array => 1,
# });
# $mm->modes->{NORMAL} ->prefix ('merge.normal.');
# $mm->modes->{NORMAL} ->prefix_re(qr/\Amerge\.normal\./);
# $mm->modes->{ADD} ->prefix ('merge.add.');
# $mm->modes->{ADD} ->prefix_re(qr/\Amerge\.add\./);
# $mm->modes->{CONCAT} ->prefix ('merge.concat.');
# $mm->modes->{CONCAT} ->prefix_re(qr/\Amerge\.concat\./);
# $mm->modes->{SUBTRACT}->prefix ('merge.subtract.');
# $mm->modes->{SUBTRACT}->prefix_re(qr/\Amerge\.subtract\./);
# $mm->modes->{DELETE} ->prefix ('merge.delete.');
# $mm->modes->{DELETE} ->prefix_re(qr/\Amerge\.delete\./);
# $mm->modes->{KEEP} ->prefix ('merge.keep.');
# $mm->modes->{KEEP} ->prefix_re(qr/\Amerge\.keep\./);
# $mm;
# };
# my $merge_res = $merger->merge($clsets[-1], $clset);
# unless ($merge_res->{success}) {
# die "Can't merge clause set: $merge_res->{error}";
# }
# $clsets[-1] = $merge_res->{result};
# } else {
# push @clsets, $clset;
# }
# }
( run in 0.597 second using v1.01-cache-2.11-cpan-5837b0d9d2c )