diff options
author | Bryan Duxbury <bryanduxbury@apache.org> | 2010-02-18 20:28:27 +0000 |
---|---|---|
committer | Bryan Duxbury <bryanduxbury@apache.org> | 2010-02-18 20:28:27 +0000 |
commit | 0e4920c6b892ef46ae491fb1c65157ee6aab1367 (patch) | |
tree | ea29c136b62147ed20558badea98c4478bf8f867 /lib/rb/lib | |
parent | becaf536211a699f1fb936752262fdb7bcd36126 (diff) | |
download | thrift-0e4920c6b892ef46ae491fb1c65157ee6aab1367.tar.gz |
THRIFT-708. rb: Is set checking methods
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@911557 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'lib/rb/lib')
-rw-r--r-- | lib/rb/lib/thrift/struct.rb | 26 | ||||
-rw-r--r-- | lib/rb/lib/thrift/union.rb | 37 |
2 files changed, 43 insertions, 20 deletions
diff --git a/lib/rb/lib/thrift/struct.rb b/lib/rb/lib/thrift/struct.rb index caa90647a..48353d30c 100644 --- a/lib/rb/lib/thrift/struct.rb +++ b/lib/rb/lib/thrift/struct.rb @@ -145,13 +145,25 @@ module Thrift diffs end - def self.field_accessor(klass, *fields) - fields.each do |field| - klass.send :attr_reader, field - klass.send :define_method, "#{field}=" do |value| - Thrift.check_type(value, klass::FIELDS.values.find { |f| f[:name].to_s == field.to_s }, field) if Thrift.type_checking - instance_variable_set("@#{field}", value) - end + def self.field_accessor(klass, field_info) + field_name_sym = field_info[:name].to_sym + klass.send :attr_reader, field_name_sym + klass.send :define_method, "#{field_info[:name]}=" do |value| + Thrift.check_type(value, field_info, field_info[:name]) if Thrift.type_checking + instance_variable_set("@#{field_name_sym}", value) + end + end + + def self.generate_accessors(klass) + klass::FIELDS.values.each do |field_info| + field_accessor(klass, field_info) + qmark_isset_method(klass, field_info) + end + end + + def self.qmark_isset_method(klass, field_info) + klass.send :define_method, "#{field_info[:name]}?" do + !self.send(field_info[:name].to_sym).nil? end end diff --git a/lib/rb/lib/thrift/union.rb b/lib/rb/lib/thrift/union.rb index 4db820eee..640e78b80 100644 --- a/lib/rb/lib/thrift/union.rb +++ b/lib/rb/lib/thrift/union.rb @@ -90,21 +90,32 @@ module Thrift [self.class.name, @setfield, @value].hash end - def self.field_accessor(klass, *fields) - fields.each do |field| - klass.send :define_method, "#{field}" do - if field == @setfield - @value - else - raise RuntimeError, "#{field} is not union's set field." - end + def self.field_accessor(klass, field_info) + klass.send :define_method, field_info[:name] do + if field_info[:name].to_sym == @setfield + @value + else + raise RuntimeError, "#{field_info[:name]} is not union's set field." end + end - klass.send :define_method, "#{field}=" do |value| - Thrift.check_type(value, klass::FIELDS.values.find {|f| f[:name].to_s == field.to_s }, field) if Thrift.type_checking - @setfield = field - @value = value - end + klass.send :define_method, "#{field_info[:name]}=" do |value| + Thrift.check_type(value, field_info, field_info[:name]) if Thrift.type_checking + @setfield = field_info[:name].to_sym + @value = value + end + end + + def self.qmark_isset_method(klass, field_info) + klass.send :define_method, "#{field_info[:name]}?" do + get_set_field == field_info[:name].to_sym && !get_value.nil? + end + end + + def self.generate_accessors(klass) + klass::FIELDS.values.each do |field_info| + field_accessor(klass, field_info) + qmark_isset_method(klass, field_info) end end |