Created
September 20, 2011 14:17
-
-
Save syohex/1229189 to your computer and use it in GitHub Desktop.
IO::Prompt::Simpleの anyoneオプションの拡張
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/IO/Prompt/Simple.pm b/lib/IO/Prompt/Simple.pm | |
index 5d5d4df..da1d7c3 100644 | |
--- a/lib/IO/Prompt/Simple.pm | |
+++ b/lib/IO/Prompt/Simple.pm | |
@@ -13,7 +13,7 @@ sub prompt { | |
my ($message, $default, $opts) = @_; | |
_croak('Usage: prompt($message, [$default, $opts])') unless defined $message; | |
- my $dispaly_default = defined $default ? "[$default]: " : ': '; | |
+ my $display_default = defined $default ? "[$default]: " : ': '; | |
$default = defined $default ? $default : ''; | |
$opts ||= {}; | |
@@ -23,10 +23,14 @@ sub prompt { | |
my $ignore_case = $opts->{ignore_case} ? 1 : 0; | |
my ($regexp, $hint); | |
my ($exclusive_map, $check_anyone) = ({}, 0); | |
- if (ref $opts->{anyone} eq 'ARRAY' && @{$opts->{anyone}}) { | |
- my @anyone = _uniq(@{$opts->{anyone}}); | |
+ if ((ref $opts->{anyone} eq 'ARRAY' && @{$opts->{anyone}}) | |
+ || (ref $opts->{anyone} eq 'HASH' && keys(%{$opts->{anyone}}) != 0)) { | |
+ my $is_arrayref = ref $opts->{anyone} eq 'ARRAY'; | |
+ | |
+ my @anyone = $is_arrayref ? _uniq(@{$opts->{anyone}}) : keys %{$opts->{anyone}}; | |
for my $stuff (@anyone) { | |
- $exclusive_map->{$ignore_case ? lc $stuff : $stuff} = 1; | |
+ my $value = $is_arrayref ? 1 : $opts->{anyone}->{$stuff}; | |
+ $exclusive_map->{$ignore_case ? lc $stuff : $stuff} = $value; | |
} | |
$check_anyone = 1; | |
$hint = sprintf "# Please answer %s\n", join ' or ', map qq{`$_`}, @anyone; | |
@@ -54,7 +58,7 @@ sub prompt { | |
my $use_default = $opts->{use_default} ? 1 : 0; | |
my $answer; | |
while (1) { | |
- print {$out} "$message $dispaly_default"; | |
+ print {$out} "$message $display_default"; | |
if ($ENV{PERL_IOPS_USE_DEFAULT} || $use_default || (!$isa_tty && eof $in)) { | |
print {$out} "$default\n"; | |
$answer = $default; | |
@@ -72,7 +76,15 @@ sub prompt { | |
$answer = $default if !defined $answer || $answer eq ''; | |
$answer = $encoder->decode($answer) if defined $encoder; | |
if ($check_anyone) { | |
- last if $exclusive_map->{$ignore_case ? lc $answer : $answer}; | |
+ if (ref $opts->{anyone} eq 'HASH') { | |
+ my $key = $ignore_case ? lc $answer : $answer; | |
+ if (exists $exclusive_map->{$key}) { | |
+ $answer = $exclusive_map->{$key}; | |
+ last; | |
+ } | |
+ } else { | |
+ last if $exclusive_map->{$ignore_case ? lc $answer : $answer}; | |
+ } | |
$answer = undef; | |
print {$out} $hint; | |
next; | |
@@ -236,7 +248,7 @@ Sets output file handle (default: STDOUT) | |
=item encode: STR | Encoder | |
-Sets encodeing. If specified, returned a decoded string. | |
+Sets encoding. If specified, returned a decoded string. | |
=back | |
diff --git a/t/02_anyone.t b/t/02_anyone.t | |
index d7a8037..d3500a0 100644 | |
--- a/t/02_anyone.t | |
+++ b/t/02_anyone.t | |
@@ -62,4 +62,27 @@ test_prompt( | |
desc => 'anyone (y/n), use_default: 1', | |
); | |
+test_prompt( | |
+ input => 'y', | |
+ answer => 1, | |
+ default => 'y', | |
+ opts => { | |
+ anyone => { y => 1, n => 0 }, | |
+ }, | |
+ prompt => 'prompt (y/n) [y]: ', | |
+ desc => 'anyone HashRef (y/n)', | |
+); | |
+ | |
+test_prompt( | |
+ input => 'foo | |
+n', | |
+ answer => '0', | |
+ opts => { | |
+ anyone => { y => 1, n => 0 }, | |
+ }, | |
+ prompt => 'prompt (y/n) : # Please answer `y` or `n` | |
+prompt (y/n) : ', | |
+ desc => 'anyone HashRef (y/n), input: foo -> n', | |
+); | |
+ | |
done_testing; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment