Class: Nl::DataTypes::SubMessage

Inherits:
Base
  • Object
show all
Defined in:
nl/lib/nl/datatypes.rb

Defined Under Namespace

Classes: Format

Instance Method Summary collapse

Constructor Details

#initialize(selector, formats) ⇒ SubMessage

Returns a new instance of SubMessage.



275
276
277
278
279
280
# File 'nl/lib/nl/datatypes.rb', line 275

def initialize(selector, formats)
  @selector = selector
  @formats = formats.transform_values do |format|
    format.is_a?(Format) ? format : Format.new(*format)
  end.freeze
end

Instance Method Details

#coerce(value, context:) ⇒ Object

Raises:

  • (TypeError)


295
296
297
298
299
300
301
302
303
304
305
306
# File 'nl/lib/nl/datatypes.rb', line 295

def coerce(value, context:)
  if value.is_a?(RawSubMessage)
    @selector.read(context)  # ensure selector value is present
    return value
  end

  format = @selector.select(context, @formats)
  return value if value.is_a?(format.type)
  return format.type.from_params(value, external_selectors: selectors(format, context)) if value.is_a?(Hash)

  raise TypeError, "value must be a Hash or an instance of #{format.type}"
end

#decode(decoder, context:, nlattr_type_flags: 0) ⇒ Object



321
322
323
324
325
326
327
328
329
# File 'nl/lib/nl/datatypes.rb', line 321

def decode(decoder, context:, nlattr_type_flags: 0)
  format = @selector.select(context, @formats) do
    return RawSubMessage.new(
      decoder.get_string,
      nlattr_type_flags:,
    )
  end
  format.type.decode(decoder, external_selectors: selectors(format, context))
end

#encode(encoder, value, context: nil) ⇒ Object



308
309
310
311
312
313
314
315
316
317
318
319
# File 'nl/lib/nl/datatypes.rb', line 308

def encode(encoder, value, context: nil)
  if value.is_a?(RawSubMessage)
    @selector.read(context)
    return value.encode(encoder)
  end

  format = @selector.select(context, @formats)
  unless value.is_a?(format.type)
    raise TypeError, "value must be an instance of #{format.type}"
  end
  value.encode(encoder, external_selectors: selectors(format, context))
end

#nlattr_type_flags(value = nil, context:) ⇒ Object



282
283
284
285
286
287
288
289
290
291
292
293
# File 'nl/lib/nl/datatypes.rb', line 282

def nlattr_type_flags(value = nil, context:)
  if value.is_a?(RawSubMessage)
    @selector.read(context)
    return value.nlattr_type_flags
  end

  format = @selector.select(context, @formats)
  unless value.is_a?(format.type)
    raise TypeError, "value must be an instance of #{format.type}"
  end
  format.nested ? Raw::NLA_F_NESTED : 0
end