comparison src/implab/data/MapSchema.js @ 34:27e8e9e38e07 default tip

Слияние
author nickolay
date Wed, 05 Jun 2019 20:44:15 +0300
parents 8af8e840dd49 1dc2fd263b90
children
comparison
equal deleted inserted replaced
33:8af8e840dd49 34:27e8e9e38e07
1 define([ "dojo/_base/declare", "../safe" ], function(declare, safe) {
2 return declare(null, {
3 /**
4 * Отображение одного типа объектов в другой.
5 *
6 * @remarks Отображения являются односторонними, т.е. позволяют
7 * перенести часть содержимого одного объекта в другой. Каждая
8 * схема отображения строится из набора примитивных
9 * отображений, которые будут применены в произвольном порядке.
10 */
11 _schema : null,
12
13 constructor : function(schema) {
14 this._schema = schema;
15 },
16
17 /**
18 * Осуществляет отображение одного объекта в другой
19 *
20 * @src{Object} Исходный объект из которого будут взяты данные
21 * @dst{Object}
22 */
23 map : function(src, dst, ctx) {
24 safe.argumentNotNull(src, "src");
25 safe.argumentNotNull(dst, "dst");
26
27 for ( var p in this._schema) {
28 var mapper = this._schema[p];
29 if (mapper instanceof Function) {
30 dst[p] = mapper(src[p]);
31 } else if (mapper && mapper.map) {
32 mapper.map(src, dst, p, ctx);
33 } else {
34 this._defaultMapper(src, dst, p, mapper, ctx);
35 }
36 }
37 },
38
39 _defaultMapper : function(src, dst, prop, opts) {
40 if (typeof (opts) == "string") {
41 if (opts in src)
42 dst[prop] = src[opts];
43 } else if (opts && opts.type instanceof Function) {
44 if (src[prop] instanceof opts.type)
45 dst[prop] = src[prop];
46 else
47 dst[prop] = this._isPrimitiveType(opts.type) ? opts.type
48 .call(null, src[prop]) : new opts.type(src[prop]);
49
50 } else {
51 if (!(prop in src))
52 if (opts && opts.required)
53 throw new Error("The " + prop + "is missing");
54 else
55 return;
56 dst[prop] = src[prop];
57 }
58 },
59
60 _isPrimitiveType : function(type) {
61 return (type === String || type === Number || type === Boolean
62 || type === Number || type === Date);
63 }
64
65 });
66
67 });