Skip to content

Instantly share code, notes, and snippets.

@syohex
Created September 20, 2011 14:17
Show Gist options
  • Save syohex/1229189 to your computer and use it in GitHub Desktop.
Save syohex/1229189 to your computer and use it in GitHub Desktop.
IO::Prompt::Simpleの anyoneオプションの拡張
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