Class: Fino::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/fino/registry.rb

Defined Under Namespace

Classes: DSL

Constant Summary collapse

DuplicateSetting =
Class.new(Fino::Error)
UnknownSetting =
Class.new(Fino::Error)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRegistry

Returns a new instance of Registry.



56
57
58
59
60
61
62
63
64
# File 'lib/fino/registry.rb', line 56

def initialize
  @setting_definitions = Set.new
  @setting_definitions_by_path = {}

  @section_definitions = Set.new
  @section_definitions_by_name = {}

  @option_registry = Fino::Settings::Select::OptionRegistry.new
end

Instance Attribute Details

#option_registryObject (readonly)

Returns the value of attribute option_registry.



54
55
56
# File 'lib/fino/registry.rb', line 54

def option_registry
  @option_registry
end

#section_definitionsObject (readonly)

Returns the value of attribute section_definitions.



54
55
56
# File 'lib/fino/registry.rb', line 54

def section_definitions
  @section_definitions
end

#setting_definitions(at: Fino::EMPTINESS) ⇒ Object (readonly)

Returns the value of attribute setting_definitions.



54
55
56
# File 'lib/fino/registry.rb', line 54

def setting_definitions
  @setting_definitions
end

Instance Method Details

#register(setting_definition) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
# File 'lib/fino/registry.rb', line 91

def register(setting_definition)
  unless @setting_definitions.add?(setting_definition)
    raise DuplicateSetting, "#{setting_definition.setting_name} is already registered at #{setting_definition.key}"
  end

  path = setting_definition.path.map(&:to_s)

  @setting_definitions_by_path.deep_set(setting_definition, *path)

  register_type_specific_data(setting_definition, path)
end

#register_section(section_definition) ⇒ Object



110
111
112
113
114
# File 'lib/fino/registry.rb', line 110

def register_section(section_definition)
  return unless @section_definitions.add?(section_definition)

  @section_definitions_by_name[section_definition.name.to_s] = section_definition
end

#register_type_specific_data(setting_definition, path) ⇒ Object



103
104
105
106
107
108
# File 'lib/fino/registry.rb', line 103

def register_type_specific_data(setting_definition, path)
  case setting_definition.type
  when Fino::Settings::Select.type_identifier
    @option_registry.register(setting_definition.options.fetch(:options, []), path)
  end
end

#section_definition(section_name) ⇒ Object



87
88
89
# File 'lib/fino/registry.rb', line 87

def section_definition(section_name)
  @section_definitions_by_name[section_name.to_s]
end

#setting_definition(setting_name, at: nil) ⇒ Object



66
67
68
# File 'lib/fino/registry.rb', line 66

def setting_definition(setting_name, at: nil)
  @setting_definitions_by_path.dig(*[at, setting_name].compact.map(&:to_s))
end

#setting_definition!(setting_name, at: nil) ⇒ Object



70
71
72
73
74
# File 'lib/fino/registry.rb', line 70

def setting_definition!(setting_name, at: nil)
  setting_definition(setting_name, at: at).tap do |definition|
    raise UnknownSetting, "Unknown setting: #{path.compact.join('.')}" unless definition
  end
end