Completed
Pull Request — master (#17)
by Marcelo
05:08
created

Base.coerce_not_nil()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
1
module Koine
2
  module Attributes
3
    module Adapter
4
      class Base
5
        attr_reader :attribute_name
6
7
        def initialize
8
          with_attribute_name('annonymous_attribute_name')
9
        end
10
11
        def coerce(value)
12
          return coerce_nil if value.nil?
13
14
          coerce_not_nil(value)
15
        end
16
17
        def default_value
18
          @default_value.respond_to?(:call) &&
19
            @default_value.call ||
20
            @default_value
21
        end
22
23
        def with_nil_value(value = nil, &block)
24
          @nil_value_set = true
25
          @nil_value = value
26
          @nil_value = block if block
27
          self
28
        end
29
30
        def with_default_value(value = nil, &block)
31
          @default_value = value
32
          @default_value = block if block
33
          self
34
        end
35
36
        def with_attribute_name(name)
37
          @attribute_name = name
38
        end
39
40
        private
41
42
        def coerce_nil
43
          if @nil_value_set
44
            return @nil_value.respond_to?(:call) ? @nil_value.call : @nil_value
45
          end
46
47
          raise_error('Cannot be nil')
48
        end
49
50
        def coerce_not_nil(_value)
51
          raise NotImplementedError
52
        end
53
54
        # duplicates if possible and freezes object
55
        def secure
56
          value = yield
57
58
          unless value.is_a?(::Symbol)
59
            value = value.dup if value.respond_to?(:dup)
60
          end
61
62
          value.freeze
63
        end
64
65
        def wrap_errors
66
          yield
67
        rescue StandardError => error
68
          raise_error(error)
69
        end
70
71
        def raise_error(message)
72
          raise Koine::Attributes::InvalidAttributeError.new(message, attribute_name)
73
        end
74
      end
75
    end
76
  end
77
end
78