/** * Copyright © schukai GmbH and all contributing authors, {{copyRightYear}}. All rights reserved. * Node module: @schukai/monster * * This source code is licensed under the GNU Affero General Public License version 3 (AGPLv3). * The full text of the license can be found at: https://www.gnu.org/licenses/agpl-3.0.en.html * * For those who do not wish to adhere to the AGPLv3, a commercial license is available. * Acquiring a commercial license allows you to use this software without complying with the AGPLv3 terms. * For more information about purchasing a commercial license, please contact schukai GmbH. * * SPDX-License-Identifier: AGPL-3.0 */ import { Base } from "../types/base.mjs"; import { validateString } from "../types/validate.mjs"; import { Transformer } from "./transformer.mjs"; export { Pipe }; /** * @private * @type {string} */ const DELIMITER = "|"; /** * The pipe class makes it possible to combine several processing steps. * * A pipe consists of commands whose input and output are connected with the pipe symbol `|`. * * With the Pipe, processing steps can be combined. Here, the value of an object is accessed via the pathfinder (path command). * the word is then converted to uppercase letters and a prefix Hello is added. the two backslash safe the space char. * * @externalExample ../../example/data/pipe.mjs * @license AGPLv3 * @since 1.5.0 * @copyright schukai GmbH * @memberOf Monster.Data */ class Pipe extends Base { /** * @param {string} pipe a pipe consists of commands whose input and output are connected with the pipe symbol `|`. * @throws {TypeError} */ constructor(pipe) { super(); validateString(pipe); this.pipe = pipe.split(DELIMITER).map((v) => { return new Transformer(v); }); } /** * @param {string} name * @param {function} callback * @param {object} context * @returns {Transformer} * @throws {TypeError} value is not a string * @throws {TypeError} value is not a function */ setCallback(name, callback, context) { for (const [, t] of Object.entries(this.pipe)) { t.setCallback(name, callback, context); } return this; } /** * run a pipe * * @param {*} value * @returns {*} */ run(value) { return this.pipe.reduce((accumulator, transformer, currentIndex, array) => { return transformer.run(accumulator); }, value); } }