97 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| '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;
 |