Class: Thrift::Union

### Home Classes Methods

### In Files

- lib/thrift/union.rb

### Parent

Object

### Methods

- ::field_accessor
- ::generate_accessors
- ::new
- ::qmark_isset_method
- #<=>
- #==
- #eql?
- #get_set_field
- #get_value
- #handle_message
- #hash
- #inspect
- #read
- #write

### Files

- CHANGELOG
- README
- Makefile

### Class/Module Index

Quicksearch

- Thrift
- Thrift::ApplicationException
- Thrift::BaseProtocol
- Thrift::BaseProtocolFactory
- Thrift::BaseServer
- Thrift::BaseServerTransport
- Thrift::BaseTransport
- Thrift::BaseTransportFactory
- Thrift::BinaryProtocol
- Thrift::BinaryProtocolAcceleratedFactory
- Thrift::BinaryProtocolFactory
- Thrift::BufferedTransport
- Thrift::BufferedTransportFactory
- Thrift::Client
- Thrift::CompactProtocol
- Thrift::CompactProtocol::CompactTypes
- Thrift::CompactProtocolFactory
- Thrift::Deserializer
- Thrift::Exception
- Thrift::FramedTransport
- Thrift::FramedTransportFactory
- Thrift::HTTPClientTransport
- Thrift::IOStreamTransport
- Thrift::MemoryBufferTransport
- Thrift::MessageTypes
- Thrift::MongrelHTTPServer
- Thrift::MongrelHTTPServer::Handler
- Thrift::NonblockingServer
- Thrift::Processor
- Thrift::ProtocolException
- Thrift::Serializer
- Thrift::ServerSocket
- Thrift::SimpleServer
- Thrift::Socket
- Thrift::Struct
- Thrift::Struct_Union
- Thrift::ThreadPoolServer
- Thrift::ThreadedServer
- Thrift::TransportException
- Thrift::TransportUtils
- Thrift::TypeError
- Thrift::Types
- Thrift::UNIXServerSocket
- Thrift::UNIXSocket
- Thrift::Union
- Fixnum

No matching classes.

# 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.