Class: KeyValueName::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/key_value_name/builder.rb

Overview

Yield-based Domain-Specific Language (DSL) to build a ‘KeyValueName`.

Defined Under Namespace

Modules: ClassMethods, InstanceMethods

Instance Method Summary collapse

Constructor Details

#initializeBuilder

Returns a new instance of Builder.



41
42
43
44
# File 'lib/key_value_name/builder.rb', line 41

def initialize
  @marshalers = {}
  @extension = nil
end

Instance Method Details

#buildObject

rubocop:disable Metrics/MethodLength



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/key_value_name/builder.rb', line 65

def build # rubocop:disable Metrics/MethodLength
  raise 'no keys defined' if @marshalers.none?

  klass = Struct.new(*@marshalers.keys) do
    def initialize(**kwargs)
      super(*kwargs.keys)
      kwargs.each { |k, v| self[k] = v }
    end

    include InstanceMethods

    class <<self
      include ClassMethods
      attr_accessor :key_value_name_spec
    end
  end
  klass.key_value_name_spec = Spec.new(@marshalers, @extension)
  klass
end

#extension(ext) ⇒ Object

rubocop:disable Style/TrivialAccessors



61
62
63
# File 'lib/key_value_name/builder.rb', line 61

def extension(ext) # rubocop:disable Style/TrivialAccessors
  @extension = ext
end

#include_keys(key_value_name_klass) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/key_value_name/builder.rb', line 46

def include_keys(key_value_name_klass)
  spec = key_value_name_klass.key_value_name_spec
  spec.marshalers.each do |name, marshaler|
    check_no_existing_marshaler(name)
    @marshalers[name] = marshaler
  end
end

#key(name, type:, **kwargs) ⇒ Object

Raises:

  • (ArgumentError)


54
55
56
57
58
59
# File 'lib/key_value_name/builder.rb', line 54

def key(name, type:, **kwargs)
  KeyValueName.check_symbol(name)
  raise ArgumentError, "bad type: #{type}" unless MARSHALERS.key?(type)
  check_no_existing_marshaler(name)
  @marshalers[name] = MARSHALERS[type].new(**kwargs)
end