5e3176cebef8875152c138170e23fe0810577d6e
[platform/framework/web/crosswalk-tizen.git] /
1 'use strict';
2
3 var YAMLException = require('./exception');
4
5 var TYPE_CONSTRUCTOR_OPTIONS = [
6   'kind',
7   'resolve',
8   'construct',
9   'instanceOf',
10   'predicate',
11   'represent',
12   'defaultStyle',
13   'styleAliases'
14 ];
15
16 var YAML_NODE_KINDS = [
17   'scalar',
18   'sequence',
19   'mapping'
20 ];
21
22 function compileStyleAliases(map) {
23   var result = {};
24
25   if (null !== map) {
26     Object.keys(map).forEach(function (style) {
27       map[style].forEach(function (alias) {
28         result[String(alias)] = style;
29       });
30     });
31   }
32
33   return result;
34 }
35
36 function Type(tag, options) {
37   options = options || {};
38
39   Object.keys(options).forEach(function (name) {
40     if (-1 === TYPE_CONSTRUCTOR_OPTIONS.indexOf(name)) {
41       throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
42     }
43   });
44
45   // TODO: Add tag format check.
46   this.tag          = tag;
47   this.kind         = options['kind']         || null;
48   this.resolve      = options['resolve']      || function () { return true; };
49   this.construct    = options['construct']    || function (data) { return data; };
50   this.instanceOf   = options['instanceOf']   || null;
51   this.predicate    = options['predicate']    || null;
52   this.represent    = options['represent']    || null;
53   this.defaultStyle = options['defaultStyle'] || null;
54   this.styleAliases = compileStyleAliases(options['styleAliases'] || null);
55
56   if (-1 === YAML_NODE_KINDS.indexOf(this.kind)) {
57     throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
58   }
59 }
60
61 module.exports = Type;