class Thrift::Union
Public Class Methods
field_accessor(klass, field_info)
click to toggle source
# File lib/thrift/union.rb, line 101 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_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
generate_accessors(klass)
click to toggle source
# File lib/thrift/union.rb, line 123 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
new(name=nil, value=nil)
click to toggle source
# File lib/thrift/union.rb, line 22 def initialize(name=nil, value=nil) if name if name.is_a? Hash if name.size > 1 raise "#{self.class} cannot be instantiated with more than one field!" end name, value = name.keys.first, name.values.first end if Thrift.type_checking raise Exception, "#{self.class} does not contain a field named #{name}!" unless name_to_id(name.to_s) end if value.nil? raise Exception, "Union #{self.class} cannot be instantiated with setfield and nil value!" end Thrift.check_type(value, struct_fields[name_to_id(name.to_s)], name) if Thrift.type_checking elsif !value.nil? raise Exception, "Value provided, but no name!" end @setfield = name @value = value end
qmark_isset_method(klass, field_info)
click to toggle source
# File lib/thrift/union.rb, line 117 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
Public Instance Methods
<=>(other)
click to toggle source
# File lib/thrift/union.rb, line 142 def <=>(other) if self.class == other.class if get_set_field == other.get_set_field if get_set_field.nil? 0 else get_value <=> other.get_value end else if get_set_field && other.get_set_field.nil? -1 elsif get_set_field.nil? && other.get_set_field 1 elsif get_set_field.nil? && other.get_set_field.nil? 0 else name_to_id(get_set_field.to_s) <=> name_to_id(other.get_set_field.to_s) end end else self.class <=> other.class end end
==(other)
click to toggle source
# File lib/thrift/union.rb, line 89 def ==(other) other != nil && @setfield == other.get_set_field && @value == other.get_value end
eql?(other)
click to toggle source
# File lib/thrift/union.rb, line 93 def eql?(other) self.class == other.class && self == other end
get_set_field()
click to toggle source
get the symbol that indicates what the currently set field type is.
# File lib/thrift/union.rb, line 131 def get_set_field @setfield end
get_value()
click to toggle source
get the current value of this union, regardless of what the set field is. generally, you should only use this method when you don’t know in advance what field to expect.
# File lib/thrift/union.rb, line 138 def get_value @value end
hash()
click to toggle source
# File lib/thrift/union.rb, line 97 def hash [self.class.name, @setfield, @value].hash end
inspect()
click to toggle source
# File lib/thrift/union.rb, line 48 def inspect if get_set_field "<#{self.class} #{@setfield}: #{inspect_field(@value, struct_fields[name_to_id(@setfield.to_s)])}>" else "<#{self.class} >" end end
read(iprot)
click to toggle source
# File lib/thrift/union.rb, line 56 def read(iprot) iprot.read_struct_begin fname, ftype, fid = iprot.read_field_begin handle_message(iprot, fid, ftype) iprot.read_field_end fname, ftype, fid = iprot.read_field_begin raise "Too many fields for union" unless (ftype == Types::STOP) iprot.read_struct_end validate end
write(oprot)
click to toggle source
# File lib/thrift/union.rb, line 69 def write(oprot) validate oprot.write_struct_begin(self.class.name) fid = self.name_to_id(@setfield.to_s) field_info = struct_fields[fid] type = field_info[:type] if is_container? type oprot.write_field_begin(@setfield, type, fid) write_container(oprot, @value, field_info) oprot.write_field_end else oprot.write_field(@setfield, type, fid, @value) end oprot.write_field_stop oprot.write_struct_end end
Protected Instance Methods
handle_message(iprot, fid, ftype)
click to toggle source
# File lib/thrift/union.rb, line 168 def handle_message(iprot, fid, ftype) field = struct_fields[fid] if field and field[:type] == ftype @value = read_field(iprot, field) name = field[:name].to_sym @setfield = name else iprot.skip(ftype) end end