'use strict';
|
|
const Hoek = require('@hapi/hoek');
|
|
const Any = require('../any');
|
|
|
const internals = {
|
Set: require('../../set')
|
};
|
|
|
internals.Boolean = class extends Any {
|
constructor() {
|
|
super();
|
this._type = 'boolean';
|
this._flags.insensitive = true;
|
this._inner.truthySet = new internals.Set();
|
this._inner.falsySet = new internals.Set();
|
}
|
|
_base(value, state, options) {
|
|
const result = {
|
value
|
};
|
|
if (typeof value === 'string' &&
|
options.convert) {
|
|
const normalized = this._flags.insensitive ? value.toLowerCase() : value;
|
result.value = (normalized === 'true' ? true
|
: (normalized === 'false' ? false : value));
|
}
|
|
if (typeof result.value !== 'boolean') {
|
result.value = (this._inner.truthySet.has(value, null, null, this._flags.insensitive) ? true
|
: (this._inner.falsySet.has(value, null, null, this._flags.insensitive) ? false : value));
|
}
|
|
result.errors = (typeof result.value === 'boolean') ? null : this.createError('boolean.base', { value }, state, options);
|
return result;
|
}
|
|
truthy(...values) {
|
|
const obj = this.clone();
|
values = Hoek.flatten(values);
|
for (let i = 0; i < values.length; ++i) {
|
const value = values[i];
|
|
Hoek.assert(value !== undefined, 'Cannot call truthy with undefined');
|
obj._inner.truthySet.add(value);
|
}
|
|
return obj;
|
}
|
|
falsy(...values) {
|
|
const obj = this.clone();
|
values = Hoek.flatten(values);
|
for (let i = 0; i < values.length; ++i) {
|
const value = values[i];
|
|
Hoek.assert(value !== undefined, 'Cannot call falsy with undefined');
|
obj._inner.falsySet.add(value);
|
}
|
|
return obj;
|
}
|
|
insensitive(enabled) {
|
|
const insensitive = enabled === undefined ? true : !!enabled;
|
|
if (this._flags.insensitive === insensitive) {
|
return this;
|
}
|
|
const obj = this.clone();
|
obj._flags.insensitive = insensitive;
|
return obj;
|
}
|
|
describe() {
|
|
const description = super.describe();
|
description.truthy = [true, ...this._inner.truthySet.values()];
|
description.falsy = [false, ...this._inner.falsySet.values()];
|
return description;
|
}
|
};
|
|
|
module.exports = new internals.Boolean();
|