aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/frontend/src/xtext/xtextServiceResults.ts
blob: 8b0dbbfbe5b96fbd35e67aa9bcd1df92fb814f62 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import { z } from 'zod';

export const pongResult = z.object({
  pong: z.string().min(1),
});

export type PongResult = z.infer<typeof pongResult>;

export const documentStateResult = z.object({
  stateId: z.string().min(1),
});

export type DocumentStateResult = z.infer<typeof documentStateResult>;

export const conflict = z.enum(['invalidStateId', 'canceled']);

export type Conflict = z.infer<typeof conflict>;

export const serviceConflictResult = z.object({
  conflict,
});

export type ServiceConflictResult = z.infer<typeof serviceConflictResult>;

export function isConflictResult(result: unknown, conflictType: Conflict): boolean {
  const parsedConflictResult = serviceConflictResult.safeParse(result);
  return parsedConflictResult.success && parsedConflictResult.data.conflict === conflictType;
}

export const severity = z.enum(['error', 'warning', 'info', 'ignore']);

export type Severity = z.infer<typeof severity>;

export const issue = z.object({
  description: z.string().min(1),
  severity,
  line: z.number().int(),
  column: z.number().int().nonnegative(),
  offset: z.number().int().nonnegative(),
  length: z.number().int().nonnegative(),
});

export type Issue = z.infer<typeof issue>;

export const validationResult = z.object({
  issues: issue.array(),
});

export type ValidationResult = z.infer<typeof validationResult>;

export const replaceRegion = z.object({
  offset: z.number().int().nonnegative(),
  length: z.number().int().nonnegative(),
  text: z.string(),
});

export type ReplaceRegion = z.infer<typeof replaceRegion>;

export const textRegion = z.object({
  offset: z.number().int().nonnegative(),
  length: z.number().int().nonnegative(),
});

export type TextRegion = z.infer<typeof textRegion>;

export const contentAssistEntry = z.object({
  prefix: z.string(),
  proposal: z.string().min(1),
  label: z.string().optional(),
  description: z.string().min(1).optional(),
  documentation: z.string().min(1).optional(),
  escapePosition: z.number().int().nonnegative().optional(),
  textReplacements: replaceRegion.array(),
  editPositions: textRegion.array(),
  kind: z.string().min(1),
});

export type ContentAssistEntry = z.infer<typeof contentAssistEntry>;

export const contentAssistResult = documentStateResult.extend({
  entries: contentAssistEntry.array(),
});

export type ContentAssistResult = z.infer<typeof contentAssistResult>;

export const highlightingRegion = z.object({
  offset: z.number().int().nonnegative(),
  length: z.number().int().nonnegative(),
  styleClasses: z.string().min(1).array(),
});

export type HighlightingRegion = z.infer<typeof highlightingRegion>;

export const highlightingResult = z.object({
  regions: highlightingRegion.array(),
});

export type HighlightingResult = z.infer<typeof highlightingResult>;

export const occurrencesResult = documentStateResult.extend({
  writeRegions: textRegion.array(),
  readRegions: textRegion.array(),
});

export type OccurrencesResult = z.infer<typeof occurrencesResult>;

export const formattingResult = documentStateResult.extend({
  formattedText: z.string(),
  replaceRegion: textRegion,
});

export type FormattingResult = z.infer<typeof formattingResult>;