Total Complexity | 17 |
Total Lines | 63 |
Duplicated Lines | 0 % |
Changes | 1 | ||
Bugs | 0 | Features | 0 |
1 | module Koine |
||
4 | class Base |
||
5 | attr_accessor :attribute_name |
||
6 | |||
7 | def initialize |
||
8 | @attribute_name = 'AnonymousAttribute' |
||
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 | private |
||
37 | |||
38 | def coerce_nil |
||
39 | if @nil_value_set |
||
40 | return @nil_value.respond_to?(:call) ? @nil_value.call : @nil_value |
||
41 | end |
||
42 | |||
43 | raise ArgumentError, 'Cannot be nil', attribute_name |
||
44 | end |
||
45 | |||
46 | def coerce_not_nil(_value) |
||
47 | raise NotImplementedError |
||
48 | end |
||
49 | |||
50 | # duplicates if possible and freezes object |
||
51 | def secure |
||
52 | value = yield |
||
53 | |||
54 | unless value.is_a?(::Symbol) |
||
55 | value = value.dup if value.respond_to?(:dup) |
||
56 | end |
||
57 | |||
58 | value.freeze |
||
59 | end |
||
60 | |||
61 | def wrap_errors |
||
62 | yield |
||
63 | rescue StandardError => error |
||
64 | raise Koine::Attributes::ArgumentError.new(error, attribute_name) |
||
65 | end |
||
66 | end |
||
67 | end |
||
70 |