Class: Takagi::Serialization::Registry

Inherits:
Object
  • Object
show all
Extended by:
Registry::Base
Defined in:
lib/takagi/serialization/registry.rb

Overview

Registry for content-format serializers

Manages serializer instances and provides encoding/decoding dispatch. Thread-safe singleton registry using Registry::Base.

Examples:

Register a custom serializer

Takagi::Serialization::Registry.register(41, XmlSerializer)

Encode data

bytes = Takagi::Serialization::Registry.encode({ temp: 25 }, 50)  # JSON

Decode data

data = Takagi::Serialization::Registry.decode(bytes, 50)  # JSON

Class Method Summary collapse

Methods included from Registry::Base

[], clear!, count, each, empty?, entries, extended, get, keys, metadata_for, register, registered?, unregister

Class Method Details

.decode(bytes, code) ⇒ Object

Decode bytes using appropriate serializer

Examples:

data = Registry.decode(bytes, 50)  # JSON decoding

Parameters:

  • bytes (String)

    Binary data to decode

  • code (Integer)

    CoAP content-format code

Returns:

  • (Object)

    Decoded Ruby object

Raises:



82
83
84
85
86
87
88
89
90
91
# File 'lib/takagi/serialization/registry.rb', line 82

def decode(bytes, code)
  serializer = serializer_for(code)
  raise UnknownFormatError, "No serializer for content-format #{code}" unless serializer

  serializer.decode(bytes)
rescue UnknownFormatError, DecodeError
  raise
rescue StandardError => e
  raise DecodeError, "Decoding failed for format #{code}: #{e.message}"
end

.encode(data, code) ⇒ String

Encode data using appropriate serializer

Examples:

bytes = Registry.encode({ temp: 25 }, 50)  # JSON encoding

Parameters:

  • data (Object)

    Ruby object to encode

  • code (Integer)

    CoAP content-format code

Returns:

  • (String)

    Encoded binary string

Raises:



61
62
63
64
65
66
67
68
69
70
# File 'lib/takagi/serialization/registry.rb', line 61

def encode(data, code)
  serializer = serializer_for(code)
  raise UnknownFormatError, "No serializer for content-format #{code}" unless serializer

  serializer.encode(data)
rescue UnknownFormatError, EncodeError
  raise
rescue StandardError => e
  raise EncodeError, "Encoding failed for format #{code}: #{e.message}"
end

.register(code, serializer, **metadata) ⇒ void

This method returns an undefined value.

Register a serializer for a content-format code

Examples:

Register with class

Registry.register(50, JsonSerializer)

Register with instance

Registry.register(50, JsonSerializer.new)

Parameters:

  • code (Integer)

    CoAP content-format code (RFC 7252 §12.3)

  • serializer (Base, Class)

    Serializer instance or class

Raises:



34
35
36
37
# File 'lib/takagi/serialization/registry.rb', line 34

def register(code, serializer, **)
  instance = instantiate_serializer(serializer)
  super(code, instance, **)
end

.serializer_for(code) ⇒ Base? Also known as: for

Get serializer for content-format code

Examples:

serializer = Registry.serializer_for(50)  # => JsonSerializer instance

Parameters:

  • code (Integer)

    CoAP content-format code

Returns:

  • (Base, nil)

    Serializer instance or nil if not registered



46
47
48
# File 'lib/takagi/serialization/registry.rb', line 46

def serializer_for(code)
  self[code]
end

.summaryString

Get human-readable summary of registered formats

Examples:

puts Registry.summary
# => "Registered Serializers:
#      50: application/json (Json)
#      60: application/cbor (Cbor)"

Returns:

  • (String)

    Summary text



124
125
126
127
128
129
130
131
132
# File 'lib/takagi/serialization/registry.rb', line 124

def summary
  lines = ["Registered Serializers:"]
  # Get snapshot to avoid holding lock during iteration
  snapshot = @mutex.synchronize { registry.dup }
  snapshot.sort.each do |code, serializer|
    lines << "  #{code}: #{serializer.content_type} (#{serializer.name})"
  end
  lines.join("\n")
end

.supported_formatsArray<Integer>

Get list of supported content-format codes

Examples:

Registry.supported_formats  # => [0, 40, 50, 60]

Returns:

  • (Array<Integer>)

    List of registered codes



111
112
113
# File 'lib/takagi/serialization/registry.rb', line 111

def supported_formats
  keys.sort
end

.supports?(code) ⇒ Boolean

Check if format is supported

Examples:

Registry.supports?(50)  # => true (JSON)
Registry.supports?(999) # => false

Parameters:

  • code (Integer)

    CoAP content-format code

Returns:

  • (Boolean)

    true if serializer registered for this code



101
102
103
# File 'lib/takagi/serialization/registry.rb', line 101

def supports?(code)
  registered?(code)
end