Method: Moped::Protocol::Message::ClassMethods#flags

Defined in:
lib/moped/protocol/message.rb

#flags(name, flag_map = {}) ⇒ Object

Declare a flag field (32 bit signed integer)

Examples:

class Update < Message
  flags :flags, upsert: 2 ** 0,
                multi:  2 ** 1
end

Parameters:

  • name (String)

    the name of this field

  • flags (Hash{Symbol => Number})

    the flags for this flag field



154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/moped/protocol/message.rb', line 154

def flags(name, flag_map = {})
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
    def #{name}
      @#{name} ||= []
    end

    def #{name}=(flags)
      if flags.is_a? Numeric
        @#{name} = #{name}_from_int(flags)
      else
        @#{name} = flags
      end
    end

    def #{name}_as_int
      bits = 0
      flags = self.#{name}
      #{flag_map.map { |flag, value| "bits |= #{value} if flags.include? #{flag.inspect}" }.join "\n"}
      bits
    end

    def #{name}_from_int(bits)
      flags = []
      #{flag_map.map { |flag, value| "flags << #{flag.inspect} if #{value} & bits == #{value}" }.join "\n"}
      flags
    end

    def serialize_#{name}(buffer)
      buffer << [#{name}_as_int].pack('l<')
    end

    def deserialize_#{name}(buffer)
      bits, = buffer.read(4).unpack('l<')

      self.#{name} = bits
    end
  RUBY

  fields << name
end