Class: ViewComponentReducible::State::Schema
- Inherits:
-
Object
- Object
- ViewComponentReducible::State::Schema
- 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
-
#add_field(name, default:) ⇒ void
Add a field definition.
-
#build(state_hash) ⇒ Hash{String=>Object}
Build state hashes from input payloads.
-
#build_data(state_hash) ⇒ Data
Build a Data object from input payloads.
- #data_class ⇒ Class
-
#defaults ⇒ Hash{String=>Object}
Build default state hashes.
-
#initialize ⇒ Schema
constructor
A new instance of Schema.
Constructor Details
#initialize ⇒ Schema
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.
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.
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.
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_class ⇒ Class
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 |
#defaults ⇒ Hash{String=>Object}
Build default state hashes.
72 73 74 |
# File 'lib/view_component_reducible/state/schema.rb', line 72 def defaults build({}) end |