Валідація - Rete.js

Валідація

Чат-бот

Фреймворк надає гнучкі системи плагінів і повідомлень, які дають змогу розширювати функціональні можливості різних компонентів і керувати їхньою поведінкою. Цього можна досягти за допомогою пайпів для певних типів повідомлень.

Валідація вузлів

Валідація буде реалізовано для додавання вузлів, де вузли певного типу будуть заборонені, доки не буде додано початковий вузол

ts
editor.addPipe(context => {
  if (context.type === 'nodecreate') {
    if (context.data instanceof EndNode) {
      const hasBeginNode = editor.getNodes().some(n => n instanceof BeginNode)

      if (!hasBeginNode) {
        alert('неможливо додати EndNode, доки не буде додано BeginNode')
        return
      }
    }
  }
  return context
})

де EndNode і BeginNode це класи, що розширюють ClassicPreset.Node.

У цьому конкретному випадку використовувався метод запобігання розповсюдженню повідомлення шляхом return без значення. Ця техніка підходить для таких типів, як nodecreate, noderemove, connectioncreate і connectionremove.

Перевірка з’єднань

Той самий принцип можна використовувати для запобігання повідомлень типу connectioncreate.

ts
editor.addPipe((context) => {
  if (context.type === "connectioncreate") {
    if (!canCreateConnection(editor, context.data)) {
      alert("Сокети не сумісні");
      return;
    }
  }
  return context;
});

де canCreateConnection — будь-яка функція, яка приймає екземпляр з’єднання context.data і повертає boolean.

Давайте візьмемо приклад Чат-бот, зокрема модулі chatbot/utils.ts і chatbot/sockets.ts, і застосуємо той самий підхід до нашої функції canCreateConnection. Спочатку ми реалізуємо розширені сокети:

ts
import { ClassicPreset } from "rete";

export class ActionSocket extends ClassicPreset.Socket {
  constructor() {
    super("Action");
  }

  isCompatibleWith(socket: ClassicPreset.Socket) {
    return socket instanceof ActionSocket;
  }
}

export class TextSocket extends ClassicPreset.Socket {
  constructor() {
    super("Text");
  }

  isCompatibleWith(socket: ClassicPreset.Socket) {
    return socket instanceof TextSocket;
  }
}

за допомогою методу isCompatibleWith типи сокетів можуть вказувати, з якими іншими типами сокетів вони сумісні.

Після цього ми реалізуємо нашу функцію, яка приймає з’єднання як аргумент, повертає відповідні сокети з вузлів і перевіряє їх на сумісність.

ts
export function canCreateConnection(editor: NodeEditor<Schemes>, connection: Schemes["Connection"]) {
  const { source, target } = getConnectionSockets(editor, connection);

  return source && target && source.isCompatibleWith(target)
}

де функція getConnectionSockets була взята з вищезгаданого прикладу.