Class: ViewComponentReducible::State::Schema

Inherits:
Object
  • Object
show all
Defined in:
lib/view_component_reducible/state/schema.rb

Overview

State schema for defining default fields and building state payloads.

Defined Under Namespace

Classes: Field

Instance Method Summary collapse

Constructor Details

#initializeSchema

Returns a new instance of Schema.



9
10
11
12
13
# File 'lib/view_component_reducible/state/schema.rb', line 9

def initialize
  @fields = []
  @data_class = nil
  @data_class_fields = nil
end

Instance Method Details

#add_field(name, default:) ⇒ void

This method returns an undefined value.

Add a field definition.

Parameters:



19
20
21
# File 'lib/view_component_reducible/state/schema.rb', line 19

def add_field(name, default:)
  @fields << Field.new(name:, default:)
end

#build(state_hash) ⇒ Hash{String=>Object}

Build state hashes from input payloads.

Parameters:

Returns:



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/view_component_reducible/state/schema.rb', line 45

def build(state_hash)
  data = {}
  @fields.each do |field|
    src = state_hash || {}
    value = if src.key?(field.name.to_s)
              src[field.name.to_s]
            elsif src.key?(field.name)
              src[field.name]
            end
    value = field.default.call if value.nil? && field.default.respond_to?(:call)
    value = field.default if value.nil? && !field.default.respond_to?(:call)

    data[field.name.to_s] = value
  end
  data
end

#build_data(state_hash) ⇒ Data

Build a Data object from input payloads.

Parameters:

Returns:



65
66
67
68
# File 'lib/view_component_reducible/state/schema.rb', line 65

def build_data(state_hash)
  data = build(state_hash)
  data_class.new(**data.transform_keys(&:to_sym))
end

#data_classClass

Returns:



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/view_component_reducible/state/schema.rb', line 24

def data_class
  field_names = @fields.map(&:name)
  return @data_class if @data_class && @data_class_fields == field_names

  defaults_proc = -> { build({}) }
  @data_class_fields = field_names
  @data_class = Data.define(*field_names) do
    def [](key)
      to_h[key.to_sym]
    end

    define_method(:with_defaults) do
      defaults = defaults_proc.call.transform_keys(&:to_sym)
      self.class.new(**defaults)
    end
  end
end

#defaultsHash{String=>Object}

Build default state hashes.

Returns:



72
73
74
# File 'lib/view_component_reducible/state/schema.rb', line 72

def defaults
  build({})
end