UNPKG

3.11 kBJavaScriptView Raw
1'use strict';
2
3var identity = require('../../nodes/identity.js');
4var Pair = require('../../nodes/Pair.js');
5var YAMLMap = require('../../nodes/YAMLMap.js');
6
7class YAMLSet extends YAMLMap.YAMLMap {
8 constructor(schema) {
9 super(schema);
10 this.tag = YAMLSet.tag;
11 }
12 add(key) {
13 let pair;
14 if (identity.isPair(key))
15 pair = key;
16 else if (key &&
17 typeof key === 'object' &&
18 'key' in key &&
19 'value' in key &&
20 key.value === null)
21 pair = new Pair.Pair(key.key, null);
22 else
23 pair = new Pair.Pair(key, null);
24 const prev = YAMLMap.findPair(this.items, pair.key);
25 if (!prev)
26 this.items.push(pair);
27 }
28 /**
29 * If `keepPair` is `true`, returns the Pair matching `key`.
30 * Otherwise, returns the value of that Pair's key.
31 */
32 get(key, keepPair) {
33 const pair = YAMLMap.findPair(this.items, key);
34 return !keepPair && identity.isPair(pair)
35 ? identity.isScalar(pair.key)
36 ? pair.key.value
37 : pair.key
38 : pair;
39 }
40 set(key, value) {
41 if (typeof value !== 'boolean')
42 throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`);
43 const prev = YAMLMap.findPair(this.items, key);
44 if (prev && !value) {
45 this.items.splice(this.items.indexOf(prev), 1);
46 }
47 else if (!prev && value) {
48 this.items.push(new Pair.Pair(key));
49 }
50 }
51 toJSON(_, ctx) {
52 return super.toJSON(_, ctx, Set);
53 }
54 toString(ctx, onComment, onChompKeep) {
55 if (!ctx)
56 return JSON.stringify(this);
57 if (this.hasAllNullValues(true))
58 return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep);
59 else
60 throw new Error('Set items must all have null values');
61 }
62 static from(schema, iterable, ctx) {
63 const { replacer } = ctx;
64 const set = new this(schema);
65 if (iterable && Symbol.iterator in Object(iterable))
66 for (let value of iterable) {
67 if (typeof replacer === 'function')
68 value = replacer.call(iterable, value, value);
69 set.items.push(Pair.createPair(value, null, ctx));
70 }
71 return set;
72 }
73}
74YAMLSet.tag = 'tag:yaml.org,2002:set';
75const set = {
76 collection: 'map',
77 identify: value => value instanceof Set,
78 nodeClass: YAMLSet,
79 default: false,
80 tag: 'tag:yaml.org,2002:set',
81 createNode: (schema, iterable, ctx) => YAMLSet.from(schema, iterable, ctx),
82 resolve(map, onError) {
83 if (identity.isMap(map)) {
84 if (map.hasAllNullValues(true))
85 return Object.assign(new YAMLSet(), map);
86 else
87 onError('Set items must all have null values');
88 }
89 else
90 onError('Expected a mapping for this tag');
91 return map;
92 }
93};
94
95exports.YAMLSet = YAMLSet;
96exports.set = set;