109 lines
2.7 KiB
JavaScript
109 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
/*eslint-disable max-len*/
|
|
|
|
var common = require('./common');
|
|
var YAMLException = require('./exception');
|
|
var Type = require('./type');
|
|
|
|
|
|
function compileList(schema, name, result) {
|
|
var exclude = [];
|
|
|
|
schema.include.forEach(function (includedSchema) {
|
|
result = compileList(includedSchema, name, result);
|
|
});
|
|
|
|
schema[name].forEach(function (currentType) {
|
|
result.forEach(function (previousType, previousIndex) {
|
|
if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {
|
|
exclude.push(previousIndex);
|
|
}
|
|
});
|
|
|
|
result.push(currentType);
|
|
});
|
|
|
|
return result.filter(function (type, index) {
|
|
return exclude.indexOf(index) === -1;
|
|
});
|
|
}
|
|
|
|
|
|
function compileMap(/* lists... */) {
|
|
var result = {
|
|
scalar: {},
|
|
sequence: {},
|
|
mapping: {},
|
|
fallback: {}
|
|
}, index, length;
|
|
|
|
function collectType(type) {
|
|
result[type.kind][type.tag] = result['fallback'][type.tag] = type;
|
|
}
|
|
|
|
for (index = 0, length = arguments.length; index < length; index += 1) {
|
|
arguments[index].forEach(collectType);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
function Schema(definition) {
|
|
this.include = definition.include || [];
|
|
this.implicit = definition.implicit || [];
|
|
this.explicit = definition.explicit || [];
|
|
|
|
this.implicit.forEach(function (type) {
|
|
if (type.loadKind && type.loadKind !== 'scalar') {
|
|
throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');
|
|
}
|
|
});
|
|
|
|
this.compiledImplicit = compileList(this, 'implicit', []);
|
|
this.compiledExplicit = compileList(this, 'explicit', []);
|
|
this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit);
|
|
}
|
|
|
|
|
|
Schema.DEFAULT = null;
|
|
|
|
|
|
Schema.create = function createSchema() {
|
|
var schemas, types;
|
|
|
|
switch (arguments.length) {
|
|
case 1:
|
|
schemas = Schema.DEFAULT;
|
|
types = arguments[0];
|
|
break;
|
|
|
|
case 2:
|
|
schemas = arguments[0];
|
|
types = arguments[1];
|
|
break;
|
|
|
|
default:
|
|
throw new YAMLException('Wrong number of arguments for Schema.create function');
|
|
}
|
|
|
|
schemas = common.toArray(schemas);
|
|
types = common.toArray(types);
|
|
|
|
if (!schemas.every(function (schema) { return schema instanceof Schema; })) {
|
|
throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');
|
|
}
|
|
|
|
if (!types.every(function (type) { return type instanceof Type; })) {
|
|
throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.');
|
|
}
|
|
|
|
return new Schema({
|
|
include: schemas,
|
|
explicit: types
|
|
});
|
|
};
|
|
|
|
|
|
module.exports = Schema;
|