Class: GDK::ConfigType::SettingsArray

Inherits:
Base
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/gdk/config_type/settings_array.rb

Constant Summary collapse

ArrayAccessError =
Class.new(StandardError)

Instance Attribute Summary collapse

Attributes inherited from Base

#builder, #parent, #user_value

Instance Method Summary collapse

Methods inherited from Base

#default_value, #root, #slug, #user_defined?, #validate!

Constructor Details

#initialize(parent:, builder:, size:) ⇒ SettingsArray

Returns a new instance of SettingsArray.



15
16
17
18
# File 'lib/gdk/config_type/settings_array.rb', line 15

def initialize(parent:, builder:, size:)
  @size = size
  super(parent: parent, builder: builder)
end

Instance Attribute Details

#elemsObject

Returns the value of attribute elems.



10
11
12
# File 'lib/gdk/config_type/settings_array.rb', line 10

def elems
  @elems
end

#sizeObject

Returns the value of attribute size.



10
11
12
# File 'lib/gdk/config_type/settings_array.rb', line 10

def size
  @size
end

Instance Method Details

#dig(*slugs) ⇒ Object

Raises:



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/gdk/config_type/settings_array.rb', line 34

def dig(*slugs)
  slugs = slugs.first.to_s.split('.') if slugs.one?
  index = Integer(slugs.shift, exception: false)

  raise ArrayAccessError, "length on #{key} must be a positive number" if index.nil? || index.negative?
  raise ArrayAccessError, "#{key} only has #{length} entries" if index >= length

  return value[index] if slugs.empty?

  value[index].dig(*slugs)
end

#dump!(user_only: false) ⇒ Object



65
66
67
# File 'lib/gdk/config_type/settings_array.rb', line 65

def dump!(user_only: false)
  elems.map { |e| e.dump!(user_only: user_only) }
end

#inspectObject



73
74
75
# File 'lib/gdk/config_type/settings_array.rb', line 73

def inspect
  "#<#{self.class.name} slug:#{slug}, length:#{length}>"
end

#lengthObject



20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/gdk/config_type/settings_array.rb', line 20

def length
  @length ||= case size
              when Proc
                parent.instance_exec(&size)
              when Numeric
                size
              when nil
                yaml_array = parent.yaml[key] ||= []
                yaml_array.length
              else
                raise ::ArgumentError, "size for #{key} must be a number, a proc, or nil (dynamic size)"
              end
end

#parse(value) ⇒ Object



69
70
71
# File 'lib/gdk/config_type/settings_array.rb', line 69

def parse(value)
  value
end

#read_valueObject



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/gdk/config_type/settings_array.rb', line 50

def read_value
  @elems = ::Array.new(length) do |i|
    arr = parent.yaml[key] ||= []
    yaml = arr[i] ||= {}

    Class.new(parent.settings_klass).tap do |k|
      k.class_exec(i, &blk)
      # # Trickery to get a block argument at instance level (don't ask me how)
      # k.class_exec do
      #   instance_exec(i, &blk)
      # end
    end.new(key: i, parent: self, yaml: yaml)
  end
end

#to_sObject



46
47
48
# File 'lib/gdk/config_type/settings_array.rb', line 46

def to_s
  dump!.to_yaml
end