UNPKG

@eclipse-glsp/protocol

Version:

The protocol definition for client-server communication in GLSP

174 lines (153 loc) 5.73 kB
/******************************************************************************** * Copyright (c) 2021-2025 STMicroelectronics and others. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0. * * This Source Code may also be made available under the following Secondary * Licenses when the conditions for such availability set forth in the Eclipse * Public License v. 2.0 are satisfied: GNU General Public License, version 2 * with the GNU Classpath Exception which is available at * https://www.gnu.org/software/classpath/license.html. * * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ import { ProposalString, hasArrayProp } from '../utils/type-util'; import { Action, RequestAction, ResponseAction } from './base-protocol'; /** * Validation in GLSP is performed by using validation markers. A marker represents the validation result for a single model element */ export interface Marker { /** * Short label describing this marker message, e.g., short validation message */ readonly label: string; /** * Full description of this marker, e.g., full validation message */ readonly description: string; /** * Id of the model element this marker refers to */ readonly elementId: string; /** * Marker kind, e.g., info, warning, error or custom kind */ readonly kind: string; } /** * The default marker kinds used in GLSP */ export namespace MarkerKind { export const INFO = 'info'; export const WARNING = 'warning'; export const ERROR = 'error'; } /** * Utility type for the reason of markers, which offers the default values `batch` and `live` as * proposals. Any other string value can be used as custom reason as well. */ export type MarkersReason = ProposalString<(typeof MarkersReason)[keyof typeof MarkersReason]>; export const MarkersReason = { /** Markers resulting from a batch validation */ BATCH: 'batch', /** Markers resulting from a live validation */ LIVE: 'live' } as const; /** * Action to retrieve markers for the specified model elements. Sent from the client to the server. * The corresponding namespace declares the action kind as constant and offers helper functions for type guard checks * and creating new `RequestMarkersActions`. */ export interface RequestMarkersAction extends RequestAction<SetMarkersAction> { kind: typeof RequestMarkersAction.KIND; /** * The elements for which markers are requested, may be just the root element. */ elementsIDs: string[]; /** * The reason for this request. * Default values are `batch` and `live`, but custom reasons can be used as well. * If not specified, the default value is `batch`. */ reason?: string; } export namespace RequestMarkersAction { export const KIND = 'requestMarkers'; export function is(object: unknown): object is RequestMarkersAction { return RequestAction.hasKind(object, KIND) && hasArrayProp(object, 'elementsIDs'); } export function create<R extends MarkersReason>( elementsIDs: string[], options: { requestId?: string; reason?: R } = {} ): RequestMarkersAction { return { kind: KIND, requestId: '', elementsIDs, reason: MarkersReason.BATCH, ...options }; } } /** * Instructs the client to add markers to the diagram. * Typically, this is a response to the {@link RequestMarkersAction} containing all validation markers, but can be sent by the server at * unknown time. * The corresponding namespace declares the action kind as constant and offers helper functions for type guard checks * and creating new `SetMarkersActions`. */ export interface SetMarkersAction extends ResponseAction { kind: typeof SetMarkersAction.KIND; /** * The list of markers to be added to the diagram. */ readonly markers: Marker[]; /** * The reason for message, such as `batch` or `live` validation. */ reason?: MarkersReason; } export namespace SetMarkersAction { export const KIND = 'setMarkers'; export function is(object: unknown): object is SetMarkersAction { return Action.hasKind(object, KIND) && hasArrayProp(object, 'markers'); } export function create<R extends MarkersReason>( markers: Marker[], options: { responseId?: string; reason?: R } = {} ): SetMarkersAction { return { kind: KIND, responseId: '', markers, reason: MarkersReason.BATCH, ...options }; } } /** * Action for clearing makers of a model * The corresponding namespace declares the action kind as constant and offers helper functions for type guard checks * and creating new `DeleteMarkersActions`. Can be sent by either the client or the server. */ export interface DeleteMarkersAction extends Action { kind: typeof DeleteMarkersAction.KIND; /** * The list of markers that has been requested by the `RequestMarkersAction`. */ markers: Marker[]; } export namespace DeleteMarkersAction { export const KIND = 'deleteMarkers'; export function is(object: unknown): object is DeleteMarkersAction { return Action.hasKind(object, KIND) && hasArrayProp(object, 'markers'); } export function create(markers: Marker[]): DeleteMarkersAction { return { kind: KIND, markers }; } }