NAME
    Data::Sah::Resolve - Resolve Sah schema

VERSION
    This document describes version 0.009 of Data::Sah::Resolve (from Perl
    distribution Data-Sah-Resolve), released on 2021-07-27.

SYNOPSIS
     use Data::Sah::Resolve qw(resolve_schema);

     my $sch = resolve_schema("int");
     # => ["int", []]

     my $sch = resolve_schema("posint*");
     # => ["int", [{min=>1}, {req=>1}]

     my $sch = resolve_schema([posint => div_by => 3]);
     # => ["int", {min=>1}, {div_by=>3}]

     my $sch = resolve_schema(["posint", "merge.delete.min"=>undef, div_by => 3]);
     # => ["int", {div_by=>3}]

DESCRIPTION
FUNCTIONS
  resolve_schema([ \%opts, ] $sch) => sch
    Sah schemas can be defined in terms of other schemas. The resolving
    process follows the base schema recursively until it finds a builtin
    type as the base.

    This routine performs the following steps:

    1. Normalize the schema
        Unless "schema_is_normalized" option is true, in which case schema
        is assumed to be normalized already.

    2. Check if the schema's type is a builtin type
        Currently this is done by checking if the module of the name
        "Data::Sah::Type::<type>" is loadable. If it is a builtin type then
        we are done.

    3. Check if the schema's type is the name of another schema
        This is done by checking if "Sah::Schema::<name>" module exists and
        is loadable. If this is the case then we retrieve the base schema
        from the $schema variable in the "Sah::Schema::<name>" package and
        repeat the process while accumulating and/or merging the clause
        sets.

    4. If schema's type is neither, we die.

    Returns "[$base_type, \@clause_sets, \%additional]".

    Example 1: "int".

    First we normalize to "["int",{}]". The type is "int" and it is a
    builtin type (Data::Sah::Type::int exists) so the final result is
    "["int", []]".

    Example 2: "posint*".

    First we normalize to "["posint",{req=>1}]". The type is "posint" and it
    is the name of another schema (Sah::Schema::posint). We retrieve the
    "posint" schema which is "["int", {summary=>"Positive integer
    (1,2,3,...)", min=>1}]". We now try to resolve "int" and find that it's
    a builtin type. So the final result is: "["int", [ {req=>1},
    {summary=>"Positive integer (1,2,3,...)", min=>1} ], {}]".

    Known options:

    *   schema_is_normalized => bool (default: 0)

        When set to true, function will skip normalizing schema and assume
        input schema is normalized.

    *   merge_clause_sets => bool (default: 1)

    Additional data returned (in the third element's hash keys):

    *   intermediates

        This is an arrayref of intermediate schema names, from the
        shallowest to the deepest. The first element of this arrayref is the
        original unresolved schema's type, then the second is the base
        schema of the original schema, and so on.

HOMEPAGE
    Please visit the project's homepage at
    <https://metacpan.org/release/Data-Sah-Resolve>.

SOURCE
    Source repository is at
    <https://github.com/perlancar/perl-Data-Sah-Resolve>.

BUGS
    Please report any bugs or feature requests on the bugtracker website
    <https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Resolve>

    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.

SEE ALSO
    Sah, Data::Sah

AUTHOR
    perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2021, 2017, 2016 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.

