module Definition::Types::Keys::Dsl

Public Instance Methods

include(other) click to toggle source
# File lib/definition/types/keys.rb, line 29
def include(other)
  raise ArgumentError.new("Included Definition can only be a Keys Definition") unless other.is_a?(Types::Keys)

  ensure_keys_do_not_interfere(other)
  other.required_definitions.each do |key, definition|
    required(key, definition)
  end
  other.optional_definitions.each do |key, definition|
    optional(key, definition)
  end
  other.defaults.each do |key, default|
    default(key, default)
  end
end
option(option_name) click to toggle source
# File lib/definition/types/keys.rb, line 20
def option(option_name)
  case option_name
  when :ignore_extra_keys
    self.ignore_extra_keys = true
  else
    raise "Option #{option_name} is not defined"
  end
end
optional(key, definition, **opts) click to toggle source
# File lib/definition/types/keys.rb, line 15
def optional(key, definition, **opts)
  optional_definitions[key] = definition
  default(key, opts[:default]) if opts.key?(:default)
end
required(key, definition) click to toggle source
# File lib/definition/types/keys.rb, line 11
def required(key, definition)
  required_definitions[key] = definition
end

Private Instance Methods

default(key, value) click to toggle source
# File lib/definition/types/keys.rb, line 46
def default(key, value)
  defaults[key] = value
end
ensure_keys_do_not_interfere(other) click to toggle source
# File lib/definition/types/keys.rb, line 50
def ensure_keys_do_not_interfere(other)
  overlapping_keys = keys & other.keys
  return if overlapping_keys.empty?

  raise ArgumentError.new(
    "Included definition tries to redefine already defined fields: #{overlapping_keys.join(', ')}"
  )
end