Class: LiveComponent::Serializer

Inherits:
Object
  • Object
show all
Defined in:
lib/live_component/serializer.rb

Constant Summary collapse

GLOBALID_KEY =
"_lc_gid"
SYMBOL_KEY =
"_lc_sym"
SYMBOL_KEYS_KEY =
"_lc_symkeys"
SYMBOL_HASH_KEY =
"_lc_symhash"
WITH_INDIFFERENT_ACCESS_KEY =
"_lc_hwia"
RESERVED_KEYS =
[
  GLOBALID_KEY, GLOBALID_KEY.to_sym,
  SYMBOL_KEYS_KEY, SYMBOL_KEYS_KEY.to_sym,
  SYMBOL_HASH_KEY, SYMBOL_HASH_KEY.to_sym,
  ObjectSerializer::OBJECT_SERIALIZER_KEY, ObjectSerializer::OBJECT_SERIALIZER_KEY.to_sym,
  WITH_INDIFFERENT_ACCESS_KEY, WITH_INDIFFERENT_ACCESS_KEY.to_sym,
].to_set

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSerializer

Returns a new instance of Serializer.



27
28
29
30
31
32
33
34
35
36
# File 'lib/live_component/serializer.rb', line 27

def initialize
  register(BigDecimal, BigDecimalSerializer)
  register(Date, DateSerializer)
  register(DateTime, DateTimeSerializer)
  register(ActiveSupport::Duration, DurationSerializer)
  register(Module, ModuleSerializer)
  register(Range, RangeSerializer)
  register(Time, TimeSerializer)
  register(ActiveSupport::TimeWithZone, TimeWithZoneSerializer)
end

Class Method Details

.makeObject



22
23
24
# File 'lib/live_component/serializer.rb', line 22

def make
  new
end

Instance Method Details

#deserialize(object) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/live_component/serializer.rb', line 84

def deserialize(object)
  case object
  when nil, true, false, String, Integer, Float
    object
  when Array
    object.map { |elem| deserialize(elem) }
  when Hash
    if object[SYMBOL_KEY]
      object["value"].to_sym
    elsif serialized_model?(object)
      default_model_serializer.deserialize(object)
    elsif serialized_global_id?(object)
      deserialize_global_id(object)
    elsif custom_serialized?(object)
      serializer_name = object[ObjectSerializer::OBJECT_SERIALIZER_KEY]
      raise SerializationError, "Serializer name is not present in the object: #{object.inspect}" unless serializer_name

      serializer = lookup_serializer(serializer_name)
      raise SerializationError, "Serializer #{serializer_name} is not known" unless serializer

      serializer.deserialize(object)
    else
      deserialize_hash(object)
    end
  else
    raise SerializationError, "Can only deserialize primitive types, got #{object.inspect}"
  end
end

#register(klass, serializer_klass) ⇒ Object



38
39
40
# File 'lib/live_component/serializer.rb', line 38

def register(klass, serializer_klass)
  self.serializers[klass] = serializer_klass.make
end

#serialize(object) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/live_component/serializer.rb', line 46

def serialize(object)
  case object
  when nil, true, false, Integer, Float, String
    object
  when Symbol
    { SYMBOL_KEY => true, "value" => object.name }
  when ActiveRecord::Base, RecordProxy
    default_model_serializer.serialize(object)
  when GlobalID::Identification
    convert_to_global_id_hash(object)
  when Array
    object.map { |elem| serialize(elem) }
  when ActiveSupport::HashWithIndifferentAccess
    serialize_indifferent_hash(object)
  when Hash
    symbol_keys = object.keys
    symbol_keys.select! { |k| k.is_a?(Symbol) }
    symbol_keys.map!(&:name)
    result = serialize_hash(object)

    if Hash.ruby2_keywords_hash?(object)
      result[SYMBOL_HASH_KEY] = true
    else
      result[SYMBOL_KEYS_KEY] = symbol_keys
    end

    result
  else
    if object.respond_to?(:permitted?) && object.respond_to?(:to_h)
      serialize_indifferent_hash(object.to_h)
    elsif serializer = serializers[object.class]
      serializer.serialize(object)
    else
      raise SerializationError, "No serializer found for #{object.class}"
    end
  end
end

#serializersObject



42
43
44
# File 'lib/live_component/serializer.rb', line 42

def serializers
  @serializers ||= {}
end