-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathdsl.rb
More file actions
59 lines (52 loc) · 1.92 KB
/
dsl.rb
File metadata and controls
59 lines (52 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
module JSONAPI
module Deserializable
class Resource
module DSL
DEFAULT_TYPE_BLOCK = proc { |t| { type: t } }
DEFAULT_ID_BLOCK = proc { |i| { id: i } }
DEFAULT_ATTR_BLOCK = proc { |v, k| { k.to_sym => v } }
DEFAULT_HAS_ONE_BLOCK = proc do |_, i, t, k|
{ "#{k}_id".to_sym => i, "#{k}_type".to_sym => t }
end
DEFAULT_HAS_MANY_BLOCK = proc do |_, i, t, k|
{ "#{k}_ids".to_sym => i, "#{k}_types".to_sym => t }
end
def type(&block)
self.type_block = block || DEFAULT_TYPE_BLOCK
end
def id(&block)
self.id_block = block || DEFAULT_ID_BLOCK
end
def attribute(key, &block)
attr_blocks[key.to_s] = block || DEFAULT_ATTR_BLOCK
end
def attributes(*keys, &block)
if keys.empty?
self.default_attr_block = block || DEFAULT_ATTR_BLOCK
else
keys.each { |k| attribute(k, &block) }
end
end
def has_one(key = nil, with_included: false, deserializer: nil, type: key, &block)
if key
has_one_rel_blocks[key.to_s] = block || DEFAULT_HAS_ONE_BLOCK
has_one_rel_options[key.to_s] = { with_included:, deserializer:, type: type&.to_s&.to_sym }
else
self.default_has_one_rel_block = block || DEFAULT_HAS_ONE_BLOCK
end
end
def has_many(key = nil, with_included: false, deserializer: nil, type: key, &block)
if key
has_many_rel_blocks[key.to_s] = block || DEFAULT_HAS_MANY_BLOCK
has_many_rel_options[key.to_s] = { with_included:, deserializer:, type: type&.to_s&.to_sym }
else
self.default_has_many_rel_block = block || DEFAULT_HAS_MANY_BLOCK
end
end
def key_format(callable = nil, &block)
self.key_formatter = callable || block
end
end
end
end
end