inflate_datetime => $param{inflate_datetime} || sub{ shift },
inflate_boolean => $param{inflate_boolean} || sub{ shift eq 'true' ? $TRUE : $FALSE },
strict_arrays => $param{strict_arrays},
- annotated => $param{annotated},
}, $class;
}
delete $self->{root};
delete $self->{tables};
- return annotate($result) if $self->{annotated};
return $result;
}
sub parse_error {
my ($self, $token, $msg) = @_;
my $line = $token ? $token->{line} : 'EOF';
- if ($self->{annotated} || $ENV{TOML_TINY_DEBUG}) {
+ if ($ENV{TOML_TINY_DEBUG}) {
my $root = Dumper($self->{root});
my $tok = Dumper($token);
my $src = substr $self->{tokenizer}{source}, $self->{tokenizer}{position}, 30;
for ($token->{type}) {
when (/float/) {
- if ($self->{annotated}) {
- return $token->{value};
- } else {
- use bignum;
- return $token->{value} + 0;
- }
+ use bignum;
+ return $token->{value} + 0;
}
when (/integer/) {
- if ($self->{annotated}) {
- return $token->{value};
- } else {
- for (my $n = $token->{value}) {
- use bigint;
+ for (my $n = $token->{value}) {
+ use bigint;
- when (/(?&Oct) $TOML/x) {
- $n =~ s/^0o/0/; # convert to perl's octal format
- return oct $n;
- }
+ when (/(?&Oct) $TOML/x) {
+ $n =~ s/^0o/0/; # convert to perl's octal format
+ return oct $n;
+ }
- when (/(?&Bin) $TOML/x) {
- return oct $n;
- }
+ when (/(?&Bin) $TOML/x) {
+ return oct $n;
+ }
- when (/(?&Hex) $TOML/x) {
- return hex $n;
- }
+ when (/(?&Hex) $TOML/x) {
+ return hex $n;
+ }
- default{
- return $n + 0;
- }
+ default{
+ return $n + 0;
}
}
}
return $table;
}
-sub annotate {
- my $value = shift;
-
- for (ref $value) {
- when ('HASH') {
- $value->{$_} = annotate($value->{$_})
- for keys %$value;
-
- return $value;
- }
-
- when ('ARRAY') {
- my $is_table_array = @$value == 0 || grep{ ref($_) ne 'HASH' } @$value;
-
- $value->[$_] = annotate($value->[$_])
- for 0..(scalar(@$value) - 1);
-
- if ($is_table_array) {
- return {type => 'array', value => $value};
- } else {
- return $value;
- }
- }
-
- when ('JSON::PP::Boolean') {
- return {type => 'bool', value => $value ? 'true' : 'false'};
- }
-
- default{
- if ($value =~ /^(true|false)$/) {
- return {type => 'bool', value => $value};
- }
-
- if ($value =~ /^(?&Float)$ $TOML/x) {
- return {type => 'float', value => $value};
- }
-
- if ($value =~ /^(?&Integer)$ $TOML/x) {
- return {type => 'integer', value => $value};
- }
-
- if ($value =~ /^(?&DateTime)$ $TOML/x) {
- return {type => 'datetime', value => $value};
- }
-
- return {
- type => 'string',
- value => $value,
- };
- }
- }
-}
-
1;
sub to_toml {
my $data = shift;
my %param = @_;
-
- if ($param{annotated} && caller ne 'TOML:Tiny::Writer') {
- $data = deannotate($data);
- }
-
my @buff;
for (ref $data) {
return '"' . $arg . '"';
}
-sub deannotate {
- my $data = shift;
-
- for (ref $data) {
- when ('HASH') {
- if (exists $data->{type} && exists $data->{value} && keys(%$data) == 2) {
- for ($data->{type}) {
- when ('bool') {
- my $bool = !!($data->{value} eq 'true');
- return bless \$bool, 'JSON::PP::Boolean';
- }
-
- when ('integer') {
- return Math::BigInt->new($data->{value});
- }
-
- when ('float') {
- # Math::BigFloat's constructor will return a Math::BigInt for
- # non-fractional values. This works around that to force a
- # BigFloat.
- return Math::BigFloat->bzero + Math::BigFloat->new($data->{value});
- }
-
- when ('datetime') {
- return DateTime::Format::RFC3339->parse_datetime($data->{value});
- }
-
- when ('array') {
- return [ map{ deannotate($_) } @{$data->{value}} ];
- }
-
- default{
- return $data->{value};
- }
- }
- }
-
- my %object;
- $object{$_} = deannotate($data->{$_}) for keys %$data;
- return \%object;
- }
-
- when ('ARRAY') {
- return [ map{ deannotate($_) } @$data ];
- }
-
- default{
- return $data;
- }
- }
-}
-
1;
+++ /dev/null
-#!/usr/bin/env perl
-
-use strict;
-use warnings;
-no warnings 'experimental';
-use lib './lib';
-use v5.18;
-
-use JSON::PP;
-use TOML::Tiny qw(to_toml);
-
-binmode STDIN, ':encoding(UTF-8)';
-binmode STDOUT, ':encoding(UTF-8)';
-
-my $src = do{ local $/; <STDIN> };
-my $json = JSON::PP->new->utf8(0)->decode($src);
-my $toml = to_toml($json, strict_arrays => 1, annotated => 1);
-
-say $toml;
-
-exit 0;