Total Complexity | 19 |
Total Lines | 72 |
Duplicated Lines | 0 % |
Changes | 1 | ||
Bugs | 0 | Features | 0 |
1 | module Koine |
||
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 | self |
||
39 | end |
||
40 | |||
41 | private |
||
42 | |||
43 | def coerce_nil |
||
44 | if @nil_value_set |
||
45 | return @nil_value.respond_to?(:call) ? @nil_value.call : @nil_value |
||
46 | end |
||
47 | |||
48 | raise_error('Cannot be nil') |
||
49 | end |
||
50 | |||
51 | def coerce_not_nil(_value) |
||
52 | raise NotImplementedError |
||
53 | end |
||
54 | |||
55 | # duplicates if possible and freezes object |
||
56 | def secure |
||
57 | value = yield |
||
58 | |||
59 | unless value.is_a?(::Symbol) |
||
60 | value = value.dup if value.respond_to?(:dup) |
||
61 | end |
||
62 | |||
63 | value.freeze |
||
64 | end |
||
65 | |||
66 | def wrap_errors |
||
67 | yield |
||
68 | rescue StandardError => error |
||
69 | raise_error(error) |
||
70 | end |
||
71 | |||
72 | def raise_error(message) |
||
73 | raise Koine::Attributes::InvalidAttributeError.new(message, attribute_name) |
||
74 | end |
||
75 | end |
||
76 | end |
||
79 |