[![Actions Status](https://github.com/ytnobody/p5-Poz/actions/workflows/test.yml/badge.svg)](https://github.com/ytnobody/p5-Poz/actions)
# NAME

Poz - A simple, composable, and extensible data validation library for Perl.

# SYNOPSIS

    use Poz qw/z/;
    use Data::UUID;
    use Time::Piece;
    my $bookSchema = z->object({
        id         => z->string->uuid->default(sub { Data::UUID->new->create_str }),   
        title      => z->string,
        author     => z->string->default("Anonymous"),
        published  => z->date,
        created_at => z->date->default(sub { Time::Piece::localtime()->strftime('%Y-%m-%d') }),
        updated_at => z->date->default(sub { Time::Piece::localtime()->strftime('%Y-%m-%d') }),
    })->as("My::Book");

    my $book = $bookSchema->parse({
        title     => "Spidering Hacks",
        author    => "Kevin Hemenway",
        published => "2003-10-01",
    }) or die "Invalid book data";
    $book->isa("My::Book"); # true

    my ($otherBook, $err) = $bookSchema->safe_parse({
        title => "Eric Sink on the Business of Software",
        author => "Eric Sink",
        published => "2006-0i-01",
    });
    $otherBook; # undef
    $err; # [{key => "", error => "Not a date"}]

    my $bookOrNumberSchema = z->union($bookSchema, z->number);
    my $bookOrNumber = $bookOrNumberSchema->parse(123);
    $bookOrNumber = $bookOrNumberSchema->parse({
        title => "Perl Best Practices",
        date => "2005-07-01",
        author => "Damian Conway",
    }); 
    

# DESCRIPTION

Poz is a simple, composable, and extensible data validation library for Perl. It is inspired heavily from Zod [https://zod.dev/](https://zod.dev/) in TypeScript.

# EXPORTS

## z

    use Poz qw/z/;
    my $builder = z;

Returns a new instance of Poz::Builder.

# METHODS

## z->object($schema)

    my $schema = z->object({
        id         => z->string->uuid->default(sub { Data::UUID->new->create_str }),   
        title      => z->string,
        author     => z->string->default("Anonymous"),
        published  => z->date,
        created_at => z->date->default(sub { Time::Piece::localtime()->strftime('%Y-%m-%d') }),
        updated_at => z->date->default(sub { Time::Piece::localtime()->strftime('%Y-%m-%d') }),
    })->as("My::Book");

Creates a new schema object.

## z->string

    my $schema = z->string;

Creates a new string schema object.

## z->number

    my $schema = z->number;

Creates a new number schema object.

## z->date

    my $schema = z->date;

Creates a new date schema object.

## z->object

    my $schema = z->object($schema);

Creates a new object schema object.

## z->array

    my $schema = z->array($schema);

Creates a new array schema object.

## z->enum

    my $schema = z->enum(@values);

Creates a new enum schema object.

## z->union

    my $schema = z->union(@schemas);

Creates a new union schema object.

# SEE ALSO

[Zod](https://zod.dev/)
[Poz::Builder](https://metacpan.org/pod/Poz%3A%3ABuilder)
[Poz::Types](https://metacpan.org/pod/Poz%3A%3ATypes)
[Poz::Types::string](https://metacpan.org/pod/Poz%3A%3ATypes%3A%3Astring)
[Poz::Types::number](https://metacpan.org/pod/Poz%3A%3ATypes%3A%3Anumber)
[Poz::Types::object](https://metacpan.org/pod/Poz%3A%3ATypes%3A%3Aobject)
[Poz::Types::array](https://metacpan.org/pod/Poz%3A%3ATypes%3A%3Aarray)
[Poz::Types::enum](https://metacpan.org/pod/Poz%3A%3ATypes%3A%3Aenum)
[Poz::Types::union](https://metacpan.org/pod/Poz%3A%3ATypes%3A%3Aunion)

# HOW TO CONTRIBUTE

If you want to contribute to Poz, you can follow the steps below:

- 1. Prepare: Install cpanm and Minilla

        $ curl -L https://cpanmin.us | perl - --sudo App::cpanminus
        $ cpanm Minilla

- 2. Fork: Please fork the repository on GitHub.

    The Repository on GitHub: [https://github.com/ytnobody/p5-Poz](https://github.com/ytnobody/p5-Poz)

- 3. Clone: Clone the repository.

        $ git clone

- 4. Branch: Create a feature branch from the main branch.

        $ git checkout -b feature-branch main

- 5. Code: Write your code and tests, then build.

        $ minil build

- 6. Test: Run the tests.

        $ minil test

- 7. Commit: Commit your changes.

        $ git commit -am "Add some feature"

- 8. Push: Push to your branch.

        $ git push origin feature-branch

- 9. Pull Request: Create a new Pull Request on GitHub.

# LICENSE

Copyright (C) ytnobody.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

# AUTHOR

ytnobody <ytnobody@gmail.com>