1 | 'use strict';
|
2 |
|
3 | var identity = require('../../nodes/identity.js');
|
4 | var Pair = require('../../nodes/Pair.js');
|
5 | var YAMLMap = require('../../nodes/YAMLMap.js');
|
6 |
|
7 | class 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 |
|
30 |
|
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 | }
|
74 | YAMLSet.tag = 'tag:yaml.org,2002:set';
|
75 | const 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 |
|
95 | exports.YAMLSet = YAMLSet;
|
96 | exports.set = set;
|