diff options
Diffstat (limited to 'lib/highline/question/answer_converter.rb')
-rw-r--r-- | lib/highline/question/answer_converter.rb | 84 |
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 |