diff options
Diffstat (limited to 'player/mruby/reply.mrb')
-rw-r--r-- | player/mruby/reply.mrb | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/player/mruby/reply.mrb b/player/mruby/reply.mrb new file mode 100644 index 0000000000..4ae65dbd3f --- /dev/null +++ b/player/mruby/reply.mrb @@ -0,0 +1,37 @@ +module M + class ReplyError < StandardError; end + class Reply < Struct.new(:val, :status) + %w(b f i s).map{|type| "to_#{type}"}.map(&:intern).each do |method| + define_method(method) { unbox!.send(method) } + end + + def unbox(default=nil, &block) + unbox!(&block) + rescue ReplyError + default + end + + def unbox!(&block) + if success? + block_given? ? yield(val) : val + else + raise ReplyError, status + end + end + + private :val + + private + def success? + status == "success" + end + + def method_missing(method, *args, &block) + if success? and val.respond_to?(method) + val.send(method, *args, &block) + else + super + end + end + end +end |