constraints/andoperator.js

'use strict';

/**
 * @author schukai GmbH
 */

import {Monster, AbstractConstraint} from "./abstract.js";
import {AbstractOperator} from "./abstractoperator.js";

/**
 * The AndOperator is used to link several contraints. The constraint is fulfilled if all constraints of the operators are fulfilled.
 *
 * ```
 * <script type="module">
 * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.7.0/dist/modules/constraints/andoperator.js';
 * new Monster.Constraint.AndOperator();
 * </script>
 * ```
 *
 * Alternatively, you can also integrate this function individually.
 *
 * ```
 * <script type="module">
 * import {AndOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.7.0/dist/modules/constraints/andoperator.js';
 * new AndOperator();
 * </script>
 * ```
 * 
 * @example
 *
 * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.7.0/dist/modules/constraints/valid.js';
 * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.7.0/dist/modules/constraints/invalid.js';
 * import {AndOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.7.0/dist/modules/constraints/andoperator.js';
 *
 * new AndOperator(
 * new Valid(), new Valid()).isValid()
 * .then(()=>console.log(true))
 * .catch(()=>console.log(false));
 * // ↦ true
 *
 * new AndOperator(
 * new Invalid(), new Valid()).isValid()
 * .then(()=>console.log(true))
 * .catch(()=>console.log(false));
 * // ↦ false
 *
 * @since 1.3.0
 * @copyright schukai GmbH
 * @memberOf Monster/Constraints
 */
class AndOperator extends AbstractOperator {

    /**
     * this method return a promise containing the result of the check.
     *
     * @param {*} value
     * @returns {Promise}
     */
    isValid(value) {
        return Promise.all([this.operantA.isValid(value), this.operantB.isValid(value)]);
    }

}

Monster.assignToNamespace('Monster.Constraints', AndOperator);
export {Monster, AndOperator}