remap 2.1.0 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/remap/compiler.rb +277 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b79008354032e3417442fc906736d8837942692da12022111ded8bdf43ed254
|
4
|
+
data.tar.gz: 4c8cc74b50b7549fb79749c378f6cc4507fc3628d83519a791ce2c9ede7686fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c710ac63224b18a156d0576e1116622e04ebd4ca51992c7736fbe38390c40737da90df958e75ff8b42ec2bacfaaac4827a86f68b6049cdf027ba4beabb8cb52c
|
7
|
+
data.tar.gz: 18270d4afa3d650343b535ac915580557e326ed42bbc9b7aa4be00e414935c38f0da4fd5e2e8da55136dd900ac4245f8aa9e98c9f79162908fb7f1ff6d35beca
|
data/lib/remap/compiler.rb
CHANGED
@@ -11,7 +11,7 @@ module Remap
|
|
11
11
|
|
12
12
|
# Constructs a rule tree given block
|
13
13
|
#
|
14
|
-
# @example Compiles two rules
|
14
|
+
# @example Compiles two rules, [get] and [map]
|
15
15
|
# rule = Remap::Compiler.call do
|
16
16
|
# get :name
|
17
17
|
# get :age
|
@@ -42,6 +42,21 @@ module Remap
|
|
42
42
|
# @param path ([]) [Array<Segment>, Segment]
|
43
43
|
# @param to ([]) [Array<Symbol>, Symbol]
|
44
44
|
#
|
45
|
+
# @example From path [:name] to [:nickname]
|
46
|
+
# rule = Remap::Compiler.call do
|
47
|
+
# map :name, to: :nickname
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# state = Remap::State.call({
|
51
|
+
# name: "John"
|
52
|
+
# })
|
53
|
+
#
|
54
|
+
# output = rule.call(state) do |failure|
|
55
|
+
# raise failure.exception
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# output.fetch(:value) # => { nickname: "John" }
|
59
|
+
#
|
45
60
|
# @return [Rule::Map::Required]
|
46
61
|
def map(*path, to: EMPTY_ARRAY, backtrace: Kernel.caller, &block)
|
47
62
|
add Rule::Map::Required.call(
|
@@ -55,6 +70,24 @@ module Remap
|
|
55
70
|
|
56
71
|
# Optional version of {#map}
|
57
72
|
#
|
73
|
+
# @example Map an optional field
|
74
|
+
# rule = Remap::Compiler.call do
|
75
|
+
# to :person do
|
76
|
+
# map? :age, to: :age
|
77
|
+
# map :name, to: :name
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# state = Remap::State.call({
|
82
|
+
# name: "John"
|
83
|
+
# })
|
84
|
+
#
|
85
|
+
# output = rule.call(state) do |failure|
|
86
|
+
# raise failure.exception
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
# output.fetch(:value) # => { person: { name: "John" } }
|
90
|
+
#
|
58
91
|
# @see #map
|
59
92
|
#
|
60
93
|
# @return [Rule::Map::Optional]
|
@@ -72,6 +105,21 @@ module Remap
|
|
72
105
|
#
|
73
106
|
# @param path ([]) [Array<Segment>, Segment]
|
74
107
|
#
|
108
|
+
# @example Map from [:name] to [:name]
|
109
|
+
# rule = Remap::Compiler.call do
|
110
|
+
# get :name
|
111
|
+
# end
|
112
|
+
#
|
113
|
+
# state = Remap::State.call({
|
114
|
+
# name: "John"
|
115
|
+
# })
|
116
|
+
#
|
117
|
+
# output = rule.call(state) do |failure|
|
118
|
+
# raise failure.exception
|
119
|
+
# end
|
120
|
+
#
|
121
|
+
# output.fetch(:value) # => { name: "John" }
|
122
|
+
#
|
75
123
|
# @return [Rule::Map::Required]
|
76
124
|
def get(*path, backtrace: Kernel.caller, &block)
|
77
125
|
map(path, to: path, backtrace: backtrace, &block)
|
@@ -79,6 +127,22 @@ module Remap
|
|
79
127
|
|
80
128
|
# Optional version of {#get}
|
81
129
|
#
|
130
|
+
# @example Map from [:name] to [:name]
|
131
|
+
# rule = Remap::Compiler.call do
|
132
|
+
# get :name
|
133
|
+
# get? :age
|
134
|
+
# end
|
135
|
+
#
|
136
|
+
# state = Remap::State.call({
|
137
|
+
# name: "John"
|
138
|
+
# })
|
139
|
+
#
|
140
|
+
# output = rule.call(state) do |failure|
|
141
|
+
# raise failure.exception
|
142
|
+
# end
|
143
|
+
#
|
144
|
+
# output.fetch(:value) # => { name: "John" }
|
145
|
+
#
|
82
146
|
# @see #get
|
83
147
|
#
|
84
148
|
# @return [Rule::Map::Optional]
|
@@ -90,6 +154,35 @@ module Remap
|
|
90
154
|
#
|
91
155
|
# @param mapper [Remap]
|
92
156
|
#
|
157
|
+
# @example Embed mapper Car into a person
|
158
|
+
# class Car < Remap::Base
|
159
|
+
# define do
|
160
|
+
# map :car do
|
161
|
+
# map :name, to: :car
|
162
|
+
# end
|
163
|
+
# end
|
164
|
+
# end
|
165
|
+
#
|
166
|
+
# rule = Remap::Compiler.call do
|
167
|
+
# map :person do
|
168
|
+
# embed Car
|
169
|
+
# end
|
170
|
+
# end
|
171
|
+
#
|
172
|
+
# state = Remap::State.call({
|
173
|
+
# person: {
|
174
|
+
# car: {
|
175
|
+
# name: "Volvo"
|
176
|
+
# }
|
177
|
+
# }
|
178
|
+
# })
|
179
|
+
#
|
180
|
+
# output = rule.call(state) do |failure|
|
181
|
+
# raise failure.exception
|
182
|
+
# end
|
183
|
+
#
|
184
|
+
# output.fetch(:value) # => { car: "Volvo" }
|
185
|
+
#
|
93
186
|
# @return [Rule::Embed]
|
94
187
|
def embed(mapper, &block)
|
95
188
|
if block
|
@@ -101,9 +194,37 @@ module Remap
|
|
101
194
|
raise ArgumentError, "Embeded mapper must be [Remap::Mapper], got [#{mapper}]"
|
102
195
|
end
|
103
196
|
|
197
|
+
# Set a static value
|
198
|
+
#
|
104
199
|
# @param path ([]) [Symbol, Array<Symbol>]
|
105
200
|
# @option to [Remap::Static]
|
106
201
|
#
|
202
|
+
# @example Set static value to { name: "John" }
|
203
|
+
# rule = Remap::Compiler.call do
|
204
|
+
# set :name, to: value("John")
|
205
|
+
# end
|
206
|
+
#
|
207
|
+
# state = Remap::State.call({})
|
208
|
+
#
|
209
|
+
# output = rule.call(state) do |failure|
|
210
|
+
# raise failure.exception
|
211
|
+
# end
|
212
|
+
#
|
213
|
+
# output.fetch(:value) # => { name: "John" }
|
214
|
+
#
|
215
|
+
# @example Reference an option
|
216
|
+
# rule = Remap::Compiler.call do
|
217
|
+
# set :name, to: option(:name)
|
218
|
+
# end
|
219
|
+
#
|
220
|
+
# state = Remap::State.call({}, options: { name: "John" })
|
221
|
+
#
|
222
|
+
# output = rule.call(state) do |failure|
|
223
|
+
# raise failure.exception
|
224
|
+
# end
|
225
|
+
#
|
226
|
+
# output.fetch(:value) # => { name: "John" }
|
227
|
+
#
|
107
228
|
# @return [Rule::Set]
|
108
229
|
# @raise [ArgumentError]
|
109
230
|
# if no path given
|
@@ -123,6 +244,21 @@ module Remap
|
|
123
244
|
# @param path [Array<Symbol>, Symbol]
|
124
245
|
# @param map [Array<Segment>, Segment]
|
125
246
|
#
|
247
|
+
# @example From path [:name] to [:nickname]
|
248
|
+
# rule = Remap::Compiler.call do
|
249
|
+
# to :nickname, map: :name
|
250
|
+
# end
|
251
|
+
#
|
252
|
+
# state = Remap::State.call({
|
253
|
+
# name: "John"
|
254
|
+
# })
|
255
|
+
#
|
256
|
+
# output = rule.call(state) do |failure|
|
257
|
+
# raise failure.exception
|
258
|
+
# end
|
259
|
+
#
|
260
|
+
# output.fetch(:value) # => { nickname: "John" }
|
261
|
+
#
|
126
262
|
# @return [Rule::Map]
|
127
263
|
def to(*path, map: EMPTY_ARRAY, backtrace: Kernel.caller, &block)
|
128
264
|
map(*map, to: path, backtrace: backtrace, &block)
|
@@ -130,6 +266,23 @@ module Remap
|
|
130
266
|
|
131
267
|
# Optional version of {#to}
|
132
268
|
#
|
269
|
+
# @example Map an optional field
|
270
|
+
# rule = Remap::Compiler.call do
|
271
|
+
# to :person do
|
272
|
+
# to? :age, map: :age
|
273
|
+
# to :name, map: :name
|
274
|
+
# end
|
275
|
+
# end
|
276
|
+
#
|
277
|
+
# state = Remap::State.call({
|
278
|
+
# name: "John"
|
279
|
+
# })
|
280
|
+
#
|
281
|
+
# output = rule.call(state) do |failure|
|
282
|
+
# raise failure.exception
|
283
|
+
# end
|
284
|
+
#
|
285
|
+
# output.fetch(:value) # => { person: { name: "John" } }
|
133
286
|
# @see #to
|
134
287
|
#
|
135
288
|
# @return [Rule::Map::Optional]
|
@@ -140,6 +293,25 @@ module Remap
|
|
140
293
|
# Iterates over the input value, passes each value
|
141
294
|
# to its block and merges the result back together
|
142
295
|
#
|
296
|
+
# @example Map an array of hashes
|
297
|
+
# rule = Remap::Compiler.call do
|
298
|
+
# each do
|
299
|
+
# map :name
|
300
|
+
# end
|
301
|
+
# end
|
302
|
+
#
|
303
|
+
# state = Remap::State.call([{
|
304
|
+
# name: "John"
|
305
|
+
# }, {
|
306
|
+
# name: "Jane"
|
307
|
+
# }])
|
308
|
+
#
|
309
|
+
# output = rule.call(state) do |failure|
|
310
|
+
# raise failure.exception
|
311
|
+
# end
|
312
|
+
#
|
313
|
+
# output.fetch(:value) # => ["John", "Jane"]
|
314
|
+
#
|
143
315
|
# @return [Rule::Each]]
|
144
316
|
# @raise [ArgumentError] if no block given
|
145
317
|
def each(&block)
|
@@ -156,6 +328,23 @@ module Remap
|
|
156
328
|
#
|
157
329
|
# @yieldreturn [Rule]
|
158
330
|
#
|
331
|
+
# @example Wrap an output value in an array
|
332
|
+
# rule = Remap::Compiler.call do
|
333
|
+
# wrap(:array) do
|
334
|
+
# map :name
|
335
|
+
# end
|
336
|
+
# end
|
337
|
+
#
|
338
|
+
# state = Remap::State.call({
|
339
|
+
# name: "John"
|
340
|
+
# })
|
341
|
+
#
|
342
|
+
# output = rule.call(state) do |failure|
|
343
|
+
# raise failure.exception
|
344
|
+
# end
|
345
|
+
#
|
346
|
+
# output.fetch(:value) # => ["John"]
|
347
|
+
#
|
159
348
|
# @return [Rule::Wrap]
|
160
349
|
# @raise [ArgumentError] if type is not :array
|
161
350
|
def wrap(type, &block)
|
@@ -170,6 +359,22 @@ module Remap
|
|
170
359
|
|
171
360
|
# Selects all elements
|
172
361
|
#
|
362
|
+
# @example Select all keys in array
|
363
|
+
# rule = Remap::Compiler.call do
|
364
|
+
# map all, :name, to: :names
|
365
|
+
# end
|
366
|
+
#
|
367
|
+
# state = Remap::State.call([
|
368
|
+
# { name: "John" },
|
369
|
+
# { name: "Jane" }
|
370
|
+
# ])
|
371
|
+
#
|
372
|
+
# output = rule.call(state) do |failure|
|
373
|
+
# raise failure.exception
|
374
|
+
# end
|
375
|
+
#
|
376
|
+
# output.fetch(:value) # => { names: ["John", "Jane"] }
|
377
|
+
#
|
173
378
|
# @return [Rule::Path::Segment::Quantifier::All]
|
174
379
|
def all(&block)
|
175
380
|
if block
|
@@ -183,6 +388,19 @@ module Remap
|
|
183
388
|
#
|
184
389
|
# @param value [Any]
|
185
390
|
#
|
391
|
+
# @example Set path to static value
|
392
|
+
# rule = Remap::Compiler.call do
|
393
|
+
# set :api_key, to: value("<SECRET>")
|
394
|
+
# end
|
395
|
+
#
|
396
|
+
# state = Remap::State.call({})
|
397
|
+
#
|
398
|
+
# output = rule.call(state) do |failure|
|
399
|
+
# raise failure.exception
|
400
|
+
# end
|
401
|
+
#
|
402
|
+
# output.fetch(:value) # => { api_key: "<SECRET>" }
|
403
|
+
#
|
186
404
|
# @return [Rule::Static::Fixed]
|
187
405
|
def value(value, &block)
|
188
406
|
if block
|
@@ -194,6 +412,19 @@ module Remap
|
|
194
412
|
|
195
413
|
# Static option to be selected
|
196
414
|
#
|
415
|
+
# @example Set path to option
|
416
|
+
# rule = Remap::Compiler.call do
|
417
|
+
# set :meaning_of_life, to: option(:number)
|
418
|
+
# end
|
419
|
+
#
|
420
|
+
# state = Remap::State.call({}, options: { number: 42 })
|
421
|
+
#
|
422
|
+
# output = rule.call(state) do |failure|
|
423
|
+
# raise failure.exception
|
424
|
+
# end
|
425
|
+
#
|
426
|
+
# output.fetch(:value) # => { meaning_of_life: 42 }
|
427
|
+
#
|
197
428
|
# @param id [Symbol]
|
198
429
|
#
|
199
430
|
# @return [Rule::Static::Option]
|
@@ -209,6 +440,21 @@ module Remap
|
|
209
440
|
#
|
210
441
|
# @param index [Integer]
|
211
442
|
#
|
443
|
+
# @example Select value at index
|
444
|
+
# rule = Remap::Compiler.call do
|
445
|
+
# map :names, at(1), to: :name
|
446
|
+
# end
|
447
|
+
#
|
448
|
+
# state = Remap::State.call({
|
449
|
+
# names: ["John", "Jane"]
|
450
|
+
# })
|
451
|
+
#
|
452
|
+
# output = rule.call(state) do |failure|
|
453
|
+
# raise failure.exception
|
454
|
+
# end
|
455
|
+
#
|
456
|
+
# output.fetch(:value) # => { name: "Jane" }
|
457
|
+
#
|
212
458
|
# @return [Path::Segment::Key]
|
213
459
|
# @raise [ArgumentError] if index is not an Integer
|
214
460
|
def at(index, &block)
|
@@ -224,6 +470,21 @@ module Remap
|
|
224
470
|
|
225
471
|
# Selects first element in input
|
226
472
|
#
|
473
|
+
# @example Select first value in an array
|
474
|
+
# rule = Remap::Compiler.call do
|
475
|
+
# map :names, first, to: :name
|
476
|
+
# end
|
477
|
+
#
|
478
|
+
# state = Remap::State.call({
|
479
|
+
# names: ["John", "Jane"]
|
480
|
+
# })
|
481
|
+
#
|
482
|
+
# output = rule.call(state) do |failure|
|
483
|
+
# raise failure.exception
|
484
|
+
# end
|
485
|
+
#
|
486
|
+
# output.fetch(:value) # => { name: "John" }
|
487
|
+
#
|
227
488
|
# @return [Path::Segment::Key]]
|
228
489
|
def first(&block)
|
229
490
|
if block
|
@@ -236,6 +497,21 @@ module Remap
|
|
236
497
|
|
237
498
|
# Selects last element in input
|
238
499
|
#
|
500
|
+
# @example Select last value in an array
|
501
|
+
# rule = Remap::Compiler.call do
|
502
|
+
# map :names, last, to: :name
|
503
|
+
# end
|
504
|
+
#
|
505
|
+
# state = Remap::State.call({
|
506
|
+
# names: ["John", "Jane", "Linus"]
|
507
|
+
# })
|
508
|
+
#
|
509
|
+
# output = rule.call(state) do |failure|
|
510
|
+
# raise failure.exception
|
511
|
+
# end
|
512
|
+
#
|
513
|
+
# output.fetch(:value) # => { name: "Linus" }
|
514
|
+
#
|
239
515
|
# @return [Path::Segment::Key]
|
240
516
|
def last(&block)
|
241
517
|
if block
|