summaryrefslogtreecommitdiff
path: root/lib/highline/question/answer_converter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/highline/question/answer_converter.rb')
-rw-r--r--lib/highline/question/answer_converter.rb84
1 files changed, 84 insertions, 0 deletions
diff --git a/lib/highline/question/answer_converter.rb b/lib/highline/question/answer_converter.rb
new file mode 100644
index 0000000..b840440
--- /dev/null
+++ b/lib/highline/question/answer_converter.rb
@@ -0,0 +1,84 @@
+# coding: utf-8
+
+require 'forwardable'
+
+class HighLine
+ class Question
+ class AnswerConverter
+ extend Forwardable
+
+ def_delegators :@question,
+ :answer, :answer=, :check_range,
+ :directory, :answer_type, :choices_complete
+
+ def initialize(question)
+ @question = question
+ end
+
+ def convert
+ return unless answer_type
+
+ self.answer = convert_by_answer_type
+ check_range
+ answer
+ end
+
+ private
+
+ def convert_by_answer_type
+ if answer_type.respond_to? :parse
+ answer_type.parse(answer)
+ elsif answer_type.is_a? Class
+ send(answer_type.name)
+ else
+ send(answer_type.class.name)
+ end
+ end
+
+ def String
+ HighLine::String(answer)
+ end
+
+ # That's a weird name for a method!
+ # But it's working ;-)
+ define_method "HighLine::String" do
+ HighLine::String(answer)
+ end
+
+ def Integer
+ Kernel.send(:Integer, answer)
+ end
+
+ def Float
+ Kernel.send(:Float, answer)
+ end
+
+ def Symbol
+ answer.to_sym
+ end
+
+ def Regexp
+ Regexp.new(answer)
+ end
+
+ def File
+ self.answer = choices_complete(answer)
+ File.open(File.join(directory.to_s, answer.last))
+ end
+
+ def Pathname
+ self.answer = choices_complete(answer)
+ Pathname.new(File.join(directory.to_s, answer.last))
+ end
+
+ def Array
+ self.answer = choices_complete(answer)
+ answer.last
+ end
+
+ def Proc
+ answer_type.call(answer)
+ end
+ end
+ end
+end \ No newline at end of file