package YAML::Ordered::Conditional;

use 5.006; use strict; use warnings; our $VERSION = '0.04';
use YAML::As::Parsed qw/Dump DumpFile Load LoadFile/; use base 'Struct::Conditional';
use Tie::IxHash;

sub encode {
        Dump($_[1]);
}

sub encode_file {
	DumpFile($_[1], $_[2]);
}

sub decode {
	if ($_[1] !~ m/\n/ && -f $_[1]) {
		return $_[0]->decode_file($_[1]);
	}
        Load($_[1]);
}

sub decode_file {
	LoadFile($_[1], $_[2]);
}

sub compile {
        my ($self, $yaml, $params, $return_struct, $out_file) = @_;
        $yaml = $self->decode($yaml) unless ref $yaml;
        $params = $self->decode($params) unless ref $params;
        $yaml = $self->SUPER::compile($yaml, $params);
        return $return_struct
		? $yaml
		: $out_file
			? $self->encode_file($out_file, $yaml)
			: $self->encode($yaml);
}

sub instantiate_hash {
	my %hash;
	tie %hash, 'Tie::IxHash';
	return %hash;
}

1;


__END__

=head1 NAME

YAML::Ordered::Conditional - A conditional language within an ordered YAML struct

=head1 VERSION

Version 0.04

=cut

=head1 SYNOPSIS

	use YAML::Ordered::Conditional;

	my $c = YAML::Ordered::Conditional->new();

	my $yaml = q|
	for:
	  country: '{country}'
	  each: countries
	  else:
	    then:
	      rank: ~
	  elsif:
	    key: country
	    m: Indonesia
	    then:
	      rank: 2
	  if:
	    key: country
	    m: Thailand
	    then:
	      rank: 1
	  key: countries
	|;

	$json = $c->compile($yaml, {
		countries => [
			{ country => "Thailand" },
			{ country => "Indonesia" },
			{ country => "Japan" },
			{ country => "Cambodia" },
		]
	});

	...

	countries:
	- country: Thailand
	  rank: 1
	- country: Indonesia
	  rank: 2
	- country: Hawaii
	  rank: ~
	- country: Canada
	  rank: ~

=head1 METHODS

=head2 new

Instantiate a new YAML::Ordered::Conditional object. Currently this expects no arguments.

	my $c = YAML::Ordered::Conditional->new;

=head2 encode

Encode a perl struct into YAML.

	$c->encode($struct);

=head2 encode

Encode a perl struct into YAML file.

	$c->encode_file($file, $yaml);

=head2 decode

Decode a YAML string into a perl struct.

	$c->decode($yaml);

=head2 decode_file

Decode a YAML file into a perl struct.

	$c->decode_file($file);

=head2 compile

Compile a yaml string or file containing valid YAML::Ordered::Conditional markup into either a yaml string, yaml file or perl struct based upon the passed params.

	$c->compile($yaml, $params); # yaml string

	$c->compile($yaml, $params, 1); # perl struct

	$c->compile($yaml, $params, 0, $out_file); # yaml file

=head1 Markup or Markdown

For Markup see L<Struct::Conditional>.

=head1 AUTHOR

LNATION, C<< <email at lnation.org> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-yaml-ordered-conditional at rt.cpan.org>, or through
the web interface at L<https://rt.cpan.org/NoAuth/ReportBug.html?Queue=YAML-Ordered-Conditional>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc YAML::Ordered::Conditional


You can also look for information at:

=over 4

=item * RT: CPAN's request tracker (report bugs here)

L<https://rt.cpan.org/NoAuth/Bugs.html?Dist=YAML-Ordered-Conditional>

=item * CPAN Ratings

L<https://cpanratings.perl.org/d/YAML-Ordered-Conditional>

=item * Search CPAN

L<https://metacpan.org/release/YAML-Ordered-Conditional>

=back


=head1 ACKNOWLEDGEMENTS


=head1 LICENSE AND COPYRIGHT

This software is Copyright (c) 2024 by LNATION.

This is free software, licensed under:

  The Artistic License 2.0 (GPL Compatible)


=cut

1; # End of YAML::Ordered::Conditional