1 | var async = require('async')
|
2 | var format = require('util').format
|
3 | var merge = require('deepmerge')
|
4 | var expandMapping = require('./lib/config/expand').expandMapping
|
5 | var readers = require('./lib/readers')
|
6 | var writers = require('./lib/writers')
|
7 |
|
8 | module.exports = function starscream(overrides, original, done) {
|
9 |
|
10 |
|
11 | var transformers = require('./lib/transformers')
|
12 |
|
13 | var options = merge({
|
14 | readers: readers,
|
15 | transformers: transformers,
|
16 | writers: writers
|
17 | }, overrides);
|
18 |
|
19 | async.reduce(expandMapping(options.mapping), {}, function(wip, entry, next) {
|
20 | async.seq(
|
21 | function(cb) {
|
22 | var fn = options.readers[entry.reader.type]
|
23 | if (!fn) return cb(new Error(format('Unknown reader: %s', entry.reader.type)))
|
24 | if (fn.length === 3) return fn(entry.reader, original, cb)
|
25 | if (fn.length === 4) return fn(options, entry.reader, original, cb)
|
26 | return cb(new Error(format('Incorrect number of reader arguments: %s', entry.reader.type)))
|
27 | },
|
28 | function(raw, cb) {
|
29 | var fn = options.transformers[entry.transformer.type]
|
30 | if (!fn) return cb(new Error(format('Unknown transformer: %s', entry.transformer.type)))
|
31 | if (fn.length === 3) return fn(entry.transformer, raw, cb)
|
32 | if (fn.length === 4) return fn(options, entry.transformer, raw, cb)
|
33 | return cb(new Error(format('Incorrect number of transformer arguments: %s', entry.transformer.type)))
|
34 | },
|
35 | function(transformed, cb) {
|
36 | var fn = options.writers[entry.writer.type]
|
37 | if (!fn) return cb(new Error(format('Unknown writer: %s', entry.writer.type)))
|
38 | if (fn.length === 4) return fn(entry.writer, wip, transformed, cb)
|
39 | if (fn.length === 5) return fn(options, entry.writer, wip, transformed, cb)
|
40 | return cb(new Error(format('Incorrect number of writer arguments: %s', entry.writer.type)))
|
41 | }
|
42 | )(next)
|
43 | }, done)
|
44 | } |
\ | No newline at end of file |