module RLP::Sedes::Serializable::ClassMethods

Public Instance Methods

add_serializable_field(name, sedes) click to toggle source
# File lib/rlp/sedes/serializable.rb, line 24
        def add_serializable_field(name, sedes)
          unless @serializable_fields
            # append or reset
            @serializable_fields = superclass.include?(Sedes::Serializable) ? superclass.serializable_fields.dup : {}
          end

          @serializable_fields[name] = sedes

          class_eval <<-ATTR
            def #{name}
              @#{name}
            end

            def #{name}=(v)
              _set_field(:#{name}, v)
            end
          ATTR
        end
deserialize(serial, **options) click to toggle source
# File lib/rlp/sedes/serializable.rb, line 69
def deserialize(serial, **options)
  exclude = options.delete(:exclude)

  begin
    values = serializable_sedes.deserialize(serial)
  rescue ListDeserializationError => e
    raise ObjectDeserializationError.new(serial: serial, sedes: self, list_exception: e)
  end

  params = Hash[*serializable_fields.keys.zip(values).flatten(1)]
  params.delete_if {|field, value| exclude.include?(field) } if exclude

  obj = self.new params.merge(options)
  obj.instance_variable_set :@_mutable, false
  obj
end
exclude(excluded_fields) click to toggle source

Create a new sedes considering only a reduced set of fields.

# File lib/rlp/sedes/serializable.rb, line 89
def exclude(excluded_fields)
  fields = serializable_fields.dup.delete_if {|k, v| excluded_fields.include?(k) }
  Class.new(self).tap {|cls| cls.set_serializable_fields fields }
end
inherit_serializable_fields!() click to toggle source
# File lib/rlp/sedes/serializable.rb, line 43
def inherit_serializable_fields!
  @serializable_fields = superclass.serializable_fields
end
serializable_fields() click to toggle source
# File lib/rlp/sedes/serializable.rb, line 47
def serializable_fields
  @serializable_fields
end
serializable_sedes() click to toggle source
# File lib/rlp/sedes/serializable.rb, line 51
def serializable_sedes
  @serializable_sedes ||= Sedes::List.new(elements: serializable_fields.values)
end
serialize(obj) click to toggle source
# File lib/rlp/sedes/serializable.rb, line 55
def serialize(obj)
  begin
    field_values = serializable_fields.keys.map {|k| obj.send k }
  rescue NoMethodError => e
    raise ObjectSerializationError.new(message: "Cannot serialize this object (missing attribute)", obj: obj)
  end

  begin
    serializable_sedes.serialize(field_values)
  rescue ListSerializationError => e
    raise ObjectSerializationError.new(obj: obj, sedes: self, list_exception: e)
  end
end
set_serializable_fields(fields) click to toggle source
# File lib/rlp/sedes/serializable.rb, line 18
def set_serializable_fields(fields)
  raise "Cannot override serializable fields!" if @serializable_fields
  @serializable_fields = {} # always reset
  fields.each {|name, sedes| add_serializable_field name, sedes }
end