123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 'use strict';
- var identity = require('../../nodes/identity.js');
- var Pair = require('../../nodes/Pair.js');
- var YAMLMap = require('../../nodes/YAMLMap.js');
- class YAMLSet extends YAMLMap.YAMLMap {
- constructor(schema) {
- super(schema);
- this.tag = YAMLSet.tag;
- }
- add(key) {
- let pair;
- if (identity.isPair(key))
- pair = key;
- else if (key &&
- typeof key === 'object' &&
- 'key' in key &&
- 'value' in key &&
- key.value === null)
- pair = new Pair.Pair(key.key, null);
- else
- pair = new Pair.Pair(key, null);
- const prev = YAMLMap.findPair(this.items, pair.key);
- if (!prev)
- this.items.push(pair);
- }
- /**
- * If `keepPair` is `true`, returns the Pair matching `key`.
- * Otherwise, returns the value of that Pair's key.
- */
- get(key, keepPair) {
- const pair = YAMLMap.findPair(this.items, key);
- return !keepPair && identity.isPair(pair)
- ? identity.isScalar(pair.key)
- ? pair.key.value
- : pair.key
- : pair;
- }
- set(key, value) {
- if (typeof value !== 'boolean')
- throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`);
- const prev = YAMLMap.findPair(this.items, key);
- if (prev && !value) {
- this.items.splice(this.items.indexOf(prev), 1);
- }
- else if (!prev && value) {
- this.items.push(new Pair.Pair(key));
- }
- }
- toJSON(_, ctx) {
- return super.toJSON(_, ctx, Set);
- }
- toString(ctx, onComment, onChompKeep) {
- if (!ctx)
- return JSON.stringify(this);
- if (this.hasAllNullValues(true))
- return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep);
- else
- throw new Error('Set items must all have null values');
- }
- static from(schema, iterable, ctx) {
- const { replacer } = ctx;
- const set = new this(schema);
- if (iterable && Symbol.iterator in Object(iterable))
- for (let value of iterable) {
- if (typeof replacer === 'function')
- value = replacer.call(iterable, value, value);
- set.items.push(Pair.createPair(value, null, ctx));
- }
- return set;
- }
- }
- YAMLSet.tag = 'tag:yaml.org,2002:set';
- const set = {
- collection: 'map',
- identify: value => value instanceof Set,
- nodeClass: YAMLSet,
- default: false,
- tag: 'tag:yaml.org,2002:set',
- createNode: (schema, iterable, ctx) => YAMLSet.from(schema, iterable, ctx),
- resolve(map, onError) {
- if (identity.isMap(map)) {
- if (map.hasAllNullValues(true))
- return Object.assign(new YAMLSet(), map);
- else
- onError('Set items must all have null values');
- }
- else
- onError('Expected a mapping for this tag');
- return map;
- }
- };
- exports.YAMLSet = YAMLSet;
- exports.set = set;
|