1use crate::{
2 types::{Breakpoint, Capabilities, InvalidatedAreas, Module, Source},
3 utils::eq_default,
4 ProtocolMessageContent,
5};
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8use typed_builder::TypedBuilder;
9
10#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
12#[serde(rename_all = "camelCase", tag = "event", content = "body")]
13pub enum Event {
14 Breakpoint(BreakpointEventBody),
16
17 Capabilities(CapabilitiesEventBody),
25
26 Continued(ContinuedEventBody),
32
33 Exited(ExitedEventBody),
35
36 Initialized,
54
55 Invalidated(InvalidatedEventBody),
61
62 LoadedSource(LoadedSourceEventBody),
64
65 Module(ModuleEventBody),
67
68 Output(OutputEventBody),
70
71 Process(ProcessEventBody),
73
74 ProgressEnd(ProgressEndEventBody),
78
79 ProgressStart(ProgressStartEventBody),
87
88 ProgressUpdate(ProgressUpdateEventBody),
94
95 Stopped(StoppedEventBody),
99
100 Terminated(TerminatedEventBody),
102
103 Thread(ThreadEventBody),
105}
106impl From<Event> for ProtocolMessageContent {
107 fn from(event: Event) -> Self {
108 Self::Event(event)
109 }
110}
111
112#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
113pub struct BreakpointEventBody {
114 #[serde(rename = "reason")]
116 pub reason: BreakpointEventReason,
117
118 #[serde(rename = "breakpoint")]
120 pub breakpoint: Breakpoint,
121
122 #[serde(skip)]
123 #[builder(default, setter(skip))]
124 private: (),
125}
126impl From<BreakpointEventBody> for Event {
127 fn from(body: BreakpointEventBody) -> Self {
128 Self::Breakpoint(body)
129 }
130}
131impl From<BreakpointEventBody> for ProtocolMessageContent {
132 fn from(body: BreakpointEventBody) -> Self {
133 Self::from(Event::from(body))
134 }
135}
136
137#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
139pub enum BreakpointEventReason {
140 #[serde(rename = "changed")]
141 Changed,
142
143 #[serde(rename = "new")]
144 New,
145
146 #[serde(rename = "removed")]
147 Removed,
148}
149
150#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
151pub struct CapabilitiesEventBody {
152 #[serde(rename = "capabilities")]
154 pub capabilities: Capabilities,
155
156 #[serde(skip)]
157 #[builder(default, setter(skip))]
158 private: (),
159}
160impl From<CapabilitiesEventBody> for Event {
161 fn from(body: CapabilitiesEventBody) -> Self {
162 Self::Capabilities(body)
163 }
164}
165impl From<CapabilitiesEventBody> for ProtocolMessageContent {
166 fn from(body: CapabilitiesEventBody) -> Self {
167 Self::from(Event::from(body))
168 }
169}
170
171#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
172pub struct ContinuedEventBody {
173 #[serde(rename = "threadId")]
175 pub thread_id: i32,
176
177 #[serde(
179 rename = "allThreadsContinued",
180 default,
181 skip_serializing_if = "eq_default"
182 )]
183 #[builder(default)]
184 pub all_threads_continued: bool,
185
186 #[serde(skip)]
187 #[builder(default, setter(skip))]
188 private: (),
189}
190impl From<ContinuedEventBody> for Event {
191 fn from(body: ContinuedEventBody) -> Self {
192 Self::Continued(body)
193 }
194}
195impl From<ContinuedEventBody> for ProtocolMessageContent {
196 fn from(body: ContinuedEventBody) -> Self {
197 Self::from(Event::from(body))
198 }
199}
200
201#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
202pub struct ExitedEventBody {
203 #[serde(rename = "exitCode")]
205 pub exit_code: i32,
206
207 #[serde(skip)]
208 #[builder(default, setter(skip))]
209 private: (),
210}
211impl From<ExitedEventBody> for Event {
212 fn from(body: ExitedEventBody) -> Self {
213 Self::Exited(body)
214 }
215}
216impl From<ExitedEventBody> for ProtocolMessageContent {
217 fn from(body: ExitedEventBody) -> Self {
218 Self::from(Event::from(body))
219 }
220}
221
222#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
223pub struct InvalidatedEventBody {
224 #[serde(rename = "areas", default, skip_serializing_if = "Vec::is_empty")]
226 #[builder(default)]
227 pub areas: Vec<InvalidatedAreas>,
228
229 #[serde(rename = "threadId", skip_serializing_if = "Option::is_none")]
231 #[builder(default)]
232 pub thread_id: Option<i32>,
233
234 #[serde(rename = "stackFrameId", skip_serializing_if = "Option::is_none")]
236 #[builder(default)]
237 pub stack_frame_id: Option<i32>,
238
239 #[serde(skip)]
240 #[builder(default, setter(skip))]
241 private: (),
242}
243impl From<InvalidatedEventBody> for Event {
244 fn from(body: InvalidatedEventBody) -> Self {
245 Self::Invalidated(body)
246 }
247}
248impl From<InvalidatedEventBody> for ProtocolMessageContent {
249 fn from(body: InvalidatedEventBody) -> Self {
250 Self::from(Event::from(body))
251 }
252}
253
254#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
255pub struct LoadedSourceEventBody {
256 #[serde(rename = "reason")]
258 pub reason: LoadedSourceEventReason,
259
260 #[serde(rename = "source")]
262 pub source: Source,
263
264 #[serde(skip)]
265 #[builder(default, setter(skip))]
266 private: (),
267}
268impl From<LoadedSourceEventBody> for Event {
269 fn from(body: LoadedSourceEventBody) -> Self {
270 Self::LoadedSource(body)
271 }
272}
273impl From<LoadedSourceEventBody> for ProtocolMessageContent {
274 fn from(body: LoadedSourceEventBody) -> Self {
275 Self::from(Event::from(body))
276 }
277}
278
279#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
281pub enum LoadedSourceEventReason {
282 #[serde(rename = "new")]
283 New,
284
285 #[serde(rename = "changed")]
286 Changed,
287
288 #[serde(rename = "removed")]
289 Removed,
290}
291
292#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
293pub struct ModuleEventBody {
294 #[serde(rename = "reason")]
296 pub reason: ModuleEventReason,
297
298 #[serde(rename = "module")]
300 pub module: Module,
301
302 #[serde(skip)]
303 #[builder(default, setter(skip))]
304 private: (),
305}
306impl From<ModuleEventBody> for Event {
307 fn from(body: ModuleEventBody) -> Self {
308 Self::Module(body)
309 }
310}
311impl From<ModuleEventBody> for ProtocolMessageContent {
312 fn from(body: ModuleEventBody) -> Self {
313 Self::from(Event::from(body))
314 }
315}
316
317#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
319pub enum ModuleEventReason {
320 #[serde(rename = "new")]
321 New,
322
323 #[serde(rename = "changed")]
324 Changed,
325
326 #[serde(rename = "removed")]
327 Removed,
328}
329
330#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
331pub struct OutputEventBody {
332 #[serde(rename = "category", default, skip_serializing_if = "eq_default")]
334 #[builder(default)]
335 pub category: OutputCategory,
336
337 #[serde(rename = "output")]
339 pub output: String,
340
341 #[serde(rename = "group", skip_serializing_if = "Option::is_none")]
343 #[builder(default)]
344 pub group: Option<OutputGroup>,
345
346 #[serde(rename = "variablesReference", skip_serializing_if = "Option::is_none")]
348 #[builder(default)]
349 pub variables_reference: Option<i32>,
350
351 #[serde(rename = "source", skip_serializing_if = "Option::is_none")]
353 #[builder(default)]
354 pub source: Option<Source>,
355
356 #[serde(rename = "line", skip_serializing_if = "Option::is_none")]
358 #[builder(default)]
359 pub line: Option<i32>,
360
361 #[serde(rename = "column", skip_serializing_if = "Option::is_none")]
363 #[builder(default)]
364 pub column: Option<i32>,
365
366 #[serde(rename = "data", skip_serializing_if = "Option::is_none")]
368 #[builder(default)]
369 pub data: Option<Value>,
370
371 #[serde(skip)]
372 #[builder(default, setter(skip))]
373 private: (),
374}
375impl From<OutputEventBody> for Event {
376 fn from(body: OutputEventBody) -> Self {
377 Self::Output(body)
378 }
379}
380impl From<OutputEventBody> for ProtocolMessageContent {
381 fn from(body: OutputEventBody) -> Self {
382 Self::from(Event::from(body))
383 }
384}
385
386#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
388pub enum OutputCategory {
389 #[serde(rename = "console")]
391 Console,
392
393 #[serde(rename = "important")]
395 Important,
396
397 #[serde(rename = "stdout")]
399 Stdout,
400
401 #[serde(rename = "stderr")]
403 Stderr,
404
405 #[serde(rename = "telemetry")]
407 Telemetry,
408}
409
410impl Default for OutputCategory {
411 fn default() -> Self {
412 OutputCategory::Console
413 }
414}
415
416#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
418pub enum OutputGroup {
419 #[serde(rename = "start")]
423 Start,
424
425 #[serde(rename = "startCollapsed")]
429 StartCollapsed,
430
431 #[serde(rename = "end")]
435 End,
436}
437
438#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
439pub struct ProcessEventBody {
440 #[serde(rename = "name")]
442 pub name: String,
443
444 #[serde(rename = "systemProcessId", skip_serializing_if = "Option::is_none")]
446 #[builder(default)]
447 pub system_process_id: Option<i32>,
448
449 #[serde(rename = "isLocalProcess", skip_serializing_if = "Option::is_none")]
451 #[builder(default)]
452 pub is_local_process: Option<bool>,
453
454 #[serde(rename = "startMethod", skip_serializing_if = "Option::is_none")]
456 #[builder(default)]
457 pub start_method: Option<ProcessStartMethod>,
458
459 #[serde(rename = "pointerSize", skip_serializing_if = "Option::is_none")]
461 #[builder(default)]
462 pub pointer_size: Option<i32>,
463
464 #[serde(skip)]
465 #[builder(default, setter(skip))]
466 private: (),
467}
468impl From<ProcessEventBody> for Event {
469 fn from(body: ProcessEventBody) -> Self {
470 Self::Process(body)
471 }
472}
473impl From<ProcessEventBody> for ProtocolMessageContent {
474 fn from(body: ProcessEventBody) -> Self {
475 Self::from(Event::from(body))
476 }
477}
478
479#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
481pub enum ProcessStartMethod {
482 #[serde(rename = "launch")]
484 Launch,
485
486 #[serde(rename = "attach")]
488 Attach,
489
490 #[serde(rename = "attachForSuspendedLaunch")]
492 AttachForSuspendedLaunch,
493}
494
495#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
496pub struct ProgressEndEventBody {
497 #[serde(rename = "progressId")]
499 pub progress_id: String,
500
501 #[serde(rename = "message", skip_serializing_if = "Option::is_none")]
503 #[builder(default)]
504 pub message: Option<String>,
505
506 #[serde(skip)]
507 #[builder(default, setter(skip))]
508 private: (),
509}
510impl From<ProgressEndEventBody> for Event {
511 fn from(body: ProgressEndEventBody) -> Self {
512 Self::ProgressEnd(body)
513 }
514}
515impl From<ProgressEndEventBody> for ProtocolMessageContent {
516 fn from(body: ProgressEndEventBody) -> Self {
517 Self::from(Event::from(body))
518 }
519}
520
521#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
522pub struct ProgressStartEventBody {
523 #[serde(rename = "progressId")]
527 pub progress_id: String,
528
529 #[serde(rename = "title")]
531 pub title: String,
532
533 #[serde(rename = "requestId", skip_serializing_if = "Option::is_none")]
539 #[builder(default)]
540 pub request_id: Option<i32>,
541
542 #[serde(rename = "cancellable", default, skip_serializing_if = "eq_default")]
548 #[builder(default)]
549 pub cancellable: bool,
550
551 #[serde(rename = "message", skip_serializing_if = "Option::is_none")]
553 #[builder(default)]
554 pub message: Option<String>,
555
556 #[serde(rename = "percentage", skip_serializing_if = "Option::is_none")]
558 #[builder(default)]
559 pub percentage: Option<u8>,
560
561 #[serde(skip)]
562 #[builder(default, setter(skip))]
563 private: (),
564}
565impl From<ProgressStartEventBody> for Event {
566 fn from(body: ProgressStartEventBody) -> Self {
567 Self::ProgressStart(body)
568 }
569}
570impl From<ProgressStartEventBody> for ProtocolMessageContent {
571 fn from(body: ProgressStartEventBody) -> Self {
572 Self::from(Event::from(body))
573 }
574}
575
576#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
577pub struct ProgressUpdateEventBody {
578 #[serde(rename = "progressId")]
580 pub progress_id: String,
581
582 #[serde(rename = "message", skip_serializing_if = "Option::is_none")]
584 #[builder(default)]
585 pub message: Option<String>,
586
587 #[serde(rename = "percentage", skip_serializing_if = "Option::is_none")]
589 #[builder(default)]
590 pub percentage: Option<u8>,
591
592 #[serde(skip)]
593 #[builder(default, setter(skip))]
594 private: (),
595}
596impl From<ProgressUpdateEventBody> for Event {
597 fn from(body: ProgressUpdateEventBody) -> Self {
598 Self::ProgressUpdate(body)
599 }
600}
601impl From<ProgressUpdateEventBody> for ProtocolMessageContent {
602 fn from(body: ProgressUpdateEventBody) -> Self {
603 Self::from(Event::from(body))
604 }
605}
606
607#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
608pub struct StoppedEventBody {
609 #[serde(rename = "reason")]
613 pub reason: StoppedEventReason,
614
615 #[serde(rename = "description", skip_serializing_if = "Option::is_none")]
617 #[builder(default)]
618 pub description: Option<String>,
619
620 #[serde(rename = "threadId", skip_serializing_if = "Option::is_none")]
622 #[builder(default)]
623 pub thread_id: Option<i32>,
624
625 #[serde(
627 rename = "preserveFocusHint",
628 default,
629 skip_serializing_if = "eq_default"
630 )]
631 #[builder(default)]
632 pub preserve_focus_hint: bool,
633
634 #[serde(rename = "text", skip_serializing_if = "Option::is_none")]
636 #[builder(default)]
637 pub text: Option<String>,
638
639 #[serde(
645 rename = "allThreadsStopped",
646 default,
647 skip_serializing_if = "eq_default"
648 )]
649 #[builder(default)]
650 pub all_threads_stopped: bool,
651
652 #[serde(
660 rename = "hitBreakpointIds",
661 default,
662 skip_serializing_if = "Vec::is_empty"
663 )]
664 #[builder(default)]
665 pub hit_breakpoint_ids: Vec<i32>,
666
667 #[serde(skip)]
668 #[builder(default, setter(skip))]
669 private: (),
670}
671impl From<StoppedEventBody> for Event {
672 fn from(body: StoppedEventBody) -> Self {
673 Self::Stopped(body)
674 }
675}
676impl From<StoppedEventBody> for ProtocolMessageContent {
677 fn from(body: StoppedEventBody) -> Self {
678 Self::from(Event::from(body))
679 }
680}
681
682#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
686pub enum StoppedEventReason {
687 #[serde(rename = "step")]
688 Step,
689
690 #[serde(rename = "breakpoint")]
691 Breakpoint,
692
693 #[serde(rename = "exception")]
694 Exception,
695
696 #[serde(rename = "pause")]
697 Pause,
698
699 #[serde(rename = "entry")]
700 Entry,
701
702 #[serde(rename = "goto")]
703 Goto,
704
705 #[serde(rename = "function breakpoint")]
706 FunctionBreakpoint,
707
708 #[serde(rename = "data breakpoint")]
709 DataBreakpoint,
710
711 #[serde(rename = "instruction breakpoint")]
712 InstructionBreakpoint,
713}
714
715#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
716pub struct TerminatedEventBody {
717 #[serde(rename = "restart", skip_serializing_if = "Option::is_none")]
721 #[builder(default)]
722 pub restart: Option<Value>,
723
724 #[serde(skip)]
725 #[builder(default, setter(skip))]
726 private: (),
727}
728impl From<TerminatedEventBody> for Event {
729 fn from(body: TerminatedEventBody) -> Self {
730 Self::Terminated(body)
731 }
732}
733impl From<TerminatedEventBody> for ProtocolMessageContent {
734 fn from(body: TerminatedEventBody) -> Self {
735 Self::from(Event::from(body))
736 }
737}
738
739#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
740pub struct ThreadEventBody {
741 #[serde(rename = "reason")]
743 pub reason: ThreadEventReason,
744
745 #[serde(rename = "threadId")]
747 pub thread_id: i32,
748
749 #[serde(skip)]
750 #[builder(default, setter(skip))]
751 private: (),
752}
753impl From<ThreadEventBody> for Event {
754 fn from(body: ThreadEventBody) -> Self {
755 Self::Thread(body)
756 }
757}
758impl From<ThreadEventBody> for ProtocolMessageContent {
759 fn from(body: ThreadEventBody) -> Self {
760 Self::from(Event::from(body))
761 }
762}
763
764#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
766pub enum ThreadEventReason {
767 #[serde(rename = "started")]
768 Started,
769
770 #[serde(rename = "exited")]
771 Exited,
772}