Class: Qrack::Protocol::Header

Inherits:
Object
  • Object
show all
Defined in:
lib/qrack/protocol/protocol08.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Header

Returns a new instance of Header.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/qrack/protocol/protocol08.rb', line 66

def initialize *args
  opts = args.pop if args.last.is_a? Hash
  opts ||= {}

  first = args.shift

  if first.is_a? ::Class and first.ancestors.include? Protocol::Class
    @klass = first
    @size = args.shift || 0
    @weight = args.shift || 0
    @properties = opts

  elsif first.is_a? Transport::Buffer or first.is_a? String
    buf = first
    buf = Transport::Buffer.new(buf) unless buf.is_a? Transport::Buffer

    @klass = Protocol.classes[buf.read(:short)]
    @weight = buf.read(:short)
    @size = buf.read(:longlong)

    props = buf.read(:properties, *klass.properties.map{|type,_| type })
    @properties = Hash[*klass.properties.map{|_,name| name }.zip(props).reject{|k,v| v.nil? }.flatten]

  else
    raise ArgumentError, 'Invalid argument'
  end

end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args, &blk) ⇒ Object



122
123
124
# File 'lib/qrack/protocol/protocol08.rb', line 122

def method_missing meth, *args, &blk
  @properties.has_key?(meth) || @klass.properties.find{|_,name| name == meth } ? @properties[meth] : super
end

Instance Attribute Details

#klassObject

Returns the value of attribute klass.



94
95
96
# File 'lib/qrack/protocol/protocol08.rb', line 94

def klass
  @klass
end

#propertiesObject

Returns the value of attribute properties.



94
95
96
# File 'lib/qrack/protocol/protocol08.rb', line 94

def properties
  @properties
end

#sizeObject

Returns the value of attribute size.



94
95
96
# File 'lib/qrack/protocol/protocol08.rb', line 94

def size
  @size
end

#weightObject

Returns the value of attribute weight.



94
95
96
# File 'lib/qrack/protocol/protocol08.rb', line 94

def weight
  @weight
end

Instance Method Details

#==(header) ⇒ Object



116
117
118
119
120
# File 'lib/qrack/protocol/protocol08.rb', line 116

def == header
  [ :klass, :size, :weight, :properties ].inject(true) do |eql, field|
    eql and __send__(field) == header.__send__(field)
  end
end

#to_binaryObject



96
97
98
99
100
101
102
103
104
105
106
# File 'lib/qrack/protocol/protocol08.rb', line 96

def to_binary
  buf = Transport::Buffer.new
  buf.write :short, klass.id
  buf.write :short, weight # XXX rabbitmq only supports weight == 0
  buf.write :longlong, size
  buf.write :properties, (klass.properties.map do |type, name|
                            [ type, properties[name] || properties[name.to_s] ]
                          end)
  buf.rewind
  buf
end

#to_frame(channel = 0) ⇒ Object



112
113
114
# File 'lib/qrack/protocol/protocol08.rb', line 112

def to_frame channel = 0
  Transport::Header.new(self, channel)
end

#to_sObject



108
109
110
# File 'lib/qrack/protocol/protocol08.rb', line 108

def to_s
  to_binary.to_s
end