Total Complexity | 14 |
Total Lines | 51 |
Duplicated Lines | 0 % |
Changes | 1 | ||
Bugs | 0 | Features | 0 |
1 | module Koine |
||
4 | class Base |
||
5 | def coerce(value) |
||
6 | return coerce_nil if value.nil? |
||
7 | |||
8 | coerce_not_nil(value) |
||
9 | end |
||
10 | |||
11 | def default_value |
||
12 | @default_value.respond_to?(:call) && |
||
13 | @default_value.call || |
||
14 | @default_value |
||
15 | end |
||
16 | |||
17 | def with_nil_value(value = nil, &block) |
||
18 | @nil_value_set = true |
||
19 | @nil_value = value |
||
20 | @nil_value = block if block |
||
21 | self |
||
22 | end |
||
23 | |||
24 | def with_default_value(value = nil, &block) |
||
25 | @default_value = value |
||
26 | @default_value = block if block |
||
27 | self |
||
28 | end |
||
29 | |||
30 | private |
||
31 | |||
32 | def coerce_nil |
||
33 | if @nil_value_set |
||
34 | return @nil_value.respond_to?(:call) ? @nil_value.call : @nil_value |
||
35 | end |
||
36 | |||
37 | raise ArgumentError, 'Cannot be nil' |
||
38 | end |
||
39 | |||
40 | def coerce_not_nil(_value) |
||
41 | raise NotImplementedError |
||
42 | end |
||
43 | |||
44 | # duplicates if possible and freezes object |
||
45 | def secure |
||
46 | value = yield |
||
47 | |||
48 | unless value.is_a?(::Symbol) |
||
49 | value = value.dup if value.respond_to?(:dup) |
||
50 | end |
||
51 | |||
52 | value.freeze |
||
53 | end |
||
54 | end |
||
55 | end |
||
58 |