package Data::QRCode::Types;
use strict;
use warnings;
use Type::Library
-base,
-declare => qw( QRCodeEC QRCodeMode );
use Type::Utils -all;
use Types::Standard qw(Int Str);
use Data::QRCode::Input;
use Carp;
my %letter_for_ec = (
Data::QRCode::Input::ECLEVEL_L() => 'L',
Data::QRCode::Input::ECLEVEL_M() => 'M',
Data::QRCode::Input::ECLEVEL_Q() => 'Q',
Data::QRCode::Input::ECLEVEL_H() => 'H',
);
my %ec_for_letter = reverse %letter_for_ec;
declare QRCodeEC,
as Int,
where { $letter_for_ec{$_} },
message { Int->validate($_) or "$_ is not a valid raw QR error correction level, acceptable values are @{[ sort keys %letter_for_ec ]}" };
coerce QRCodeEC,
from Str,
via {
return $_ if /^[0-9]+$/;
$ec_for_letter{uc($_)}
|| croak "$_ is not a valid simbolic QR error correction level, acceptable values are @{[ sort keys %ec_for_letter ]}";
};
my %name_for_mode = (
Data::QRCode::Input::MODE_NUM() => 'NUM',
Data::QRCode::Input::MODE_AN() => 'AN',
Data::QRCode::Input::MODE_8() => '8BIT',
Data::QRCode::Input::MODE_KANJI() => 'KANJI',
Data::QRCode::Input::MODE_STRUCTURE() => 'STRUCTURE',
Data::QRCode::Input::MODE_ECI() => 'ECI',
Data::QRCode::Input::MODE_FNC1FIRST() => 'FNC1FIRST',
Data::QRCode::Input::MODE_FNC1SECOND() => 'FNC1SECOND',
);
my %mode_for_name = reverse %name_for_mode;
declare QRCodeMode,
as Int,
where { $name_for_mode{$_} },
message { Int->validate($_) or "$_ is not a valid raw QR error data mode, acceptable values are @{[ sort keys %name_for_mode ]}" };
coerce QRCodeMode,
from Str,
via {
return $_ if /^[0-9]+$/;
$mode_for_name{uc($_)}
|| croak "$_ is not a valid simbolic QR data mode, acceptable values are @{[ sort keys %mode_for_name ]}";
};
1;