1use crate::{
2 types::{
3 Breakpoint, BreakpointLocation, Capabilities, CompletionItem, DataBreakpointAccessType,
4 DisassembledInstruction, ExceptionBreakMode, ExceptionDetails, GotoTarget, Message, Module,
5 Scope, Source, StackFrame, StepInTarget, Thread, Variable, VariablePresentationHint,
6 },
7 utils::{eq_default, true_},
8 ProtocolMessageContent, SequenceNumber,
9};
10use serde::{
11 de::{Error, Unexpected},
12 Deserialize, Deserializer, Serialize, Serializer,
13};
14use serde_json::{Number, Value};
15use typed_builder::TypedBuilder;
16
17#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
19pub struct Response {
20 pub request_seq: SequenceNumber,
22
23 #[serde(
24 flatten,
25 deserialize_with = "deserialize_response_result",
26 serialize_with = "serialize_response_result"
27 )]
28 pub result: Result<SuccessResponse, ErrorResponse>,
29}
30impl From<Response> for ProtocolMessageContent {
31 fn from(response: Response) -> Self {
32 Self::Response(response)
33 }
34}
35
36#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
37pub struct ErrorResponse {
38 pub command: String,
40
41 pub message: String,
49
50 #[builder(default)]
51 pub body: ErrorResponseBody,
52
53 #[serde(skip)]
54 #[builder(default, setter(skip))]
55 private: (),
56}
57
58#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
59pub struct ErrorResponseBody {
60 pub error: Option<Message>,
62
63 #[serde(skip)]
64 private: (),
65}
66impl ErrorResponseBody {
67 pub fn new(error: Option<Message>) -> Self {
68 Self { error, private: () }
69 }
70}
71impl Default for ErrorResponseBody {
72 fn default() -> Self {
73 ErrorResponseBody::new(None)
74 }
75}
76
77#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
79#[serde(rename_all = "camelCase", tag = "command", content = "body")]
80pub enum SuccessResponse {
81 Attach,
83
84 BreakpointLocations(BreakpointLocationsResponseBody),
88
89 Cancel,
91
92 Completions(CompletionsResponseBody),
94
95 ConfigurationDone,
97
98 Continue(ContinueResponseBody),
100
101 DataBreakpointInfo(DataBreakpointInfoResponseBody),
103
104 Disassemble(DisassembleResponseBody),
106
107 Disconnect,
109
110 Evaluate(EvaluateResponseBody),
112
113 ExceptionInfo(ExceptionInfoResponseBody),
115
116 Goto,
118
119 GotoTargets(GotoTargetsResponseBody),
121
122 Initialize(Capabilities),
124
125 Launch,
127
128 LoadedSources(LoadedSourcesResponseBody),
130
131 Modules(ModulesResponseBody),
133
134 Next,
136
137 Pause,
139
140 ReadMemory(ReadMemoryResponseBody),
142
143 RestartFrame,
145
146 Restart,
148
149 ReverseContinue,
151
152 RunInTerminal(RunInTerminalResponseBody),
154
155 Scopes(ScopesResponseBody),
157
158 SetBreakpoints(SetBreakpointsResponseBody),
168
169 SetDataBreakpoints(SetDataBreakpointsResponseBody),
173
174 SetExceptionBreakpoints(SetExceptionBreakpointsResponseBody),
182
183 SetExpression(SetExpressionResponseBody),
185
186 SetFunctionBreakpoints(SetFunctionBreakpointsResponseBody),
190
191 SetInstructionBreakpoints(SetInstructionBreakpointsResponseBody),
193
194 SetVariable(SetVariableResponseBody),
196
197 Source(SourceResponseBody),
199
200 StackTrace(StackTraceResponseBody),
202
203 StepBack,
205
206 StepIn,
208
209 StepInTargets(StepInTargetsResponseBody),
211
212 StepOut,
214
215 Terminate,
217
218 TerminateThreads,
220
221 Threads(ThreadsResponseBody),
223
224 Variables(VariablesResponseBody),
226}
227
228#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
229pub struct BreakpointLocationsResponseBody {
230 #[serde(rename = "breakpoints")]
232 pub breakpoints: Vec<BreakpointLocation>,
233
234 #[serde(skip)]
235 #[builder(default, setter(skip))]
236 private: (),
237}
238impl From<BreakpointLocationsResponseBody> for SuccessResponse {
239 fn from(args: BreakpointLocationsResponseBody) -> Self {
240 Self::BreakpointLocations(args)
241 }
242}
243
244#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
245pub struct CompletionsResponseBody {
246 #[serde(rename = "targets")]
248 pub targets: Vec<CompletionItem>,
249
250 #[serde(skip)]
251 #[builder(default, setter(skip))]
252 private: (),
253}
254impl From<CompletionsResponseBody> for SuccessResponse {
255 fn from(args: CompletionsResponseBody) -> Self {
256 Self::Completions(args)
257 }
258}
259
260#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
261pub struct ContinueResponseBody {
262 #[serde(rename = "allThreadsContinued", default = "true_")]
266 #[builder(default)]
267 pub all_threads_continued: bool,
268
269 #[serde(skip)]
270 #[builder(default, setter(skip))]
271 private: (),
272}
273impl From<ContinueResponseBody> for SuccessResponse {
274 fn from(args: ContinueResponseBody) -> Self {
275 Self::Continue(args)
276 }
277}
278
279#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
280pub struct DataBreakpointInfoResponseBody {
281 #[serde(rename = "dataId")]
283 #[builder(default)]
284 pub data_id: Option<String>,
285
286 #[serde(rename = "description")]
288 pub description: String,
289
290 #[serde(rename = "accessTypes", skip_serializing_if = "Option::is_none")]
292 #[builder(default)]
293 pub access_types: Option<Vec<DataBreakpointAccessType>>,
294
295 #[serde(rename = "canPersist", default, skip_serializing_if = "eq_default")]
297 #[builder(default)]
298 pub can_persist: bool,
299
300 #[serde(skip)]
301 #[builder(default, setter(skip))]
302 private: (),
303}
304impl From<DataBreakpointInfoResponseBody> for SuccessResponse {
305 fn from(args: DataBreakpointInfoResponseBody) -> Self {
306 Self::DataBreakpointInfo(args)
307 }
308}
309
310#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
311pub struct DisassembleResponseBody {
312 #[serde(rename = "instructions")]
314 pub instructions: Vec<DisassembledInstruction>,
315
316 #[serde(skip)]
317 #[builder(default, setter(skip))]
318 private: (),
319}
320impl From<DisassembleResponseBody> for SuccessResponse {
321 fn from(args: DisassembleResponseBody) -> Self {
322 Self::Disassemble(args)
323 }
324}
325
326#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
327pub struct EvaluateResponseBody {
328 #[serde(rename = "result")]
330 pub result: String,
331
332 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
336 #[builder(default)]
337 pub type_: Option<String>,
338
339 #[serde(rename = "presentationHint", skip_serializing_if = "Option::is_none")]
341 #[builder(default)]
342 pub presentation_hint: Option<VariablePresentationHint>,
343
344 #[serde(rename = "variablesReference")]
348 pub variables_reference: i32,
349
350 #[serde(rename = "namedVariables", skip_serializing_if = "Option::is_none")]
356 #[builder(default)]
357 pub named_variables: Option<i32>,
358
359 #[serde(rename = "indexedVariables", skip_serializing_if = "Option::is_none")]
365 #[builder(default)]
366 pub indexed_variables: Option<i32>,
367
368 #[serde(rename = "memoryReference", skip_serializing_if = "Option::is_none")]
374 #[builder(default)]
375 pub memory_reference: Option<String>,
376
377 #[serde(skip)]
378 #[builder(default, setter(skip))]
379 private: (),
380}
381impl From<EvaluateResponseBody> for SuccessResponse {
382 fn from(args: EvaluateResponseBody) -> Self {
383 Self::Evaluate(args)
384 }
385}
386
387#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
388pub struct ExceptionInfoResponseBody {
389 #[serde(rename = "exceptionId")]
391 pub exception_id: String,
392
393 #[serde(rename = "description", skip_serializing_if = "Option::is_none")]
395 #[builder(default)]
396 pub description: Option<String>,
397
398 #[serde(rename = "breakMode")]
400 pub break_mode: ExceptionBreakMode,
401
402 #[serde(rename = "details", skip_serializing_if = "Option::is_none")]
404 #[builder(default)]
405 pub details: Option<ExceptionDetails>,
406
407 #[serde(skip)]
408 #[builder(default, setter(skip))]
409 private: (),
410}
411impl From<ExceptionInfoResponseBody> for SuccessResponse {
412 fn from(args: ExceptionInfoResponseBody) -> Self {
413 Self::ExceptionInfo(args)
414 }
415}
416
417#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
418pub struct GotoTargetsResponseBody {
419 #[serde(rename = "targets")]
421 pub targets: Vec<GotoTarget>,
422
423 #[serde(skip)]
424 #[builder(default, setter(skip))]
425 private: (),
426}
427impl From<GotoTargetsResponseBody> for SuccessResponse {
428 fn from(args: GotoTargetsResponseBody) -> Self {
429 Self::GotoTargets(args)
430 }
431}
432
433#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
434pub struct LoadedSourcesResponseBody {
435 #[serde(rename = "sources")]
437 pub sources: Vec<Source>,
438
439 #[serde(skip)]
440 #[builder(default, setter(skip))]
441 private: (),
442}
443impl From<LoadedSourcesResponseBody> for SuccessResponse {
444 fn from(args: LoadedSourcesResponseBody) -> Self {
445 Self::LoadedSources(args)
446 }
447}
448
449#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
450pub struct ModulesResponseBody {
451 #[serde(rename = "modules")]
453 pub modules: Vec<Module>,
454
455 #[serde(rename = "totalModules", skip_serializing_if = "Option::is_none")]
457 #[builder(default)]
458 pub total_modules: Option<i32>,
459
460 #[serde(skip)]
461 #[builder(default, setter(skip))]
462 private: (),
463}
464impl From<ModulesResponseBody> for SuccessResponse {
465 fn from(args: ModulesResponseBody) -> Self {
466 Self::Modules(args)
467 }
468}
469
470#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
471pub struct ReadMemoryResponseBody {
472 #[serde(rename = "address")]
476 pub address: String,
477
478 #[serde(rename = "unreadableBytes", skip_serializing_if = "Option::is_none")]
482 #[builder(default)]
483 pub unreadable_bytes: Option<i32>,
484
485 #[serde(rename = "data", skip_serializing_if = "Option::is_none")]
487 #[builder(default)]
488 pub data: Option<String>,
489
490 #[serde(skip)]
491 #[builder(default, setter(skip))]
492 private: (),
493}
494impl From<ReadMemoryResponseBody> for SuccessResponse {
495 fn from(args: ReadMemoryResponseBody) -> Self {
496 Self::ReadMemory(args)
497 }
498}
499
500#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
501pub struct RunInTerminalResponseBody {
502 #[serde(rename = "processId", skip_serializing_if = "Option::is_none")]
504 #[builder(default)]
505 pub process_id: Option<i32>,
506
507 #[serde(rename = "shellProcessId", skip_serializing_if = "Option::is_none")]
509 #[builder(default)]
510 pub shell_process_id: Option<i32>,
511
512 #[serde(skip)]
513 #[builder(default, setter(skip))]
514 private: (),
515}
516impl From<RunInTerminalResponseBody> for SuccessResponse {
517 fn from(args: RunInTerminalResponseBody) -> Self {
518 Self::RunInTerminal(args)
519 }
520}
521
522#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
523pub struct ScopesResponseBody {
524 #[serde(rename = "scopes")]
526 pub scopes: Vec<Scope>,
527
528 #[serde(skip)]
529 #[builder(default, setter(skip))]
530 private: (),
531}
532impl From<ScopesResponseBody> for SuccessResponse {
533 fn from(args: ScopesResponseBody) -> Self {
534 Self::Scopes(args)
535 }
536}
537
538#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
539pub struct SetBreakpointsResponseBody {
540 #[serde(rename = "breakpoints")]
544 pub breakpoints: Vec<Breakpoint>,
545
546 #[serde(skip)]
547 #[builder(default, setter(skip))]
548 private: (),
549}
550impl From<SetBreakpointsResponseBody> for SuccessResponse {
551 fn from(args: SetBreakpointsResponseBody) -> Self {
552 Self::SetBreakpoints(args)
553 }
554}
555
556#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
557pub struct SetDataBreakpointsResponseBody {
558 #[serde(rename = "breakpoints")]
560 pub breakpoints: Vec<Breakpoint>,
561
562 #[serde(skip)]
563 #[builder(default, setter(skip))]
564 private: (),
565}
566impl From<SetDataBreakpointsResponseBody> for SuccessResponse {
567 fn from(args: SetDataBreakpointsResponseBody) -> Self {
568 Self::SetDataBreakpoints(args)
569 }
570}
571
572#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
573pub struct SetExceptionBreakpointsResponseBody {
574 #[serde(rename = "breakpoints", skip_serializing_if = "Option::is_none")]
578 #[builder(default)]
579 pub breakpoints: Option<Vec<Breakpoint>>,
580
581 #[serde(skip)]
582 #[builder(default, setter(skip))]
583 private: (),
584}
585impl From<SetExceptionBreakpointsResponseBody> for SuccessResponse {
586 fn from(args: SetExceptionBreakpointsResponseBody) -> Self {
587 Self::SetExceptionBreakpoints(args)
588 }
589}
590
591#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
592pub struct SetExpressionResponseBody {
593 #[serde(rename = "value")]
595 pub value: String,
596
597 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
601 #[builder(default)]
602 pub type_: Option<String>,
603
604 #[serde(rename = "presentationHint", skip_serializing_if = "Option::is_none")]
606 #[builder(default)]
607 pub presentation_hint: Option<VariablePresentationHint>,
608
609 #[serde(rename = "variablesReference", skip_serializing_if = "Option::is_none")]
613 #[builder(default)]
614 pub variables_reference: Option<i32>,
615
616 #[serde(rename = "namedVariables", skip_serializing_if = "Option::is_none")]
622 #[builder(default)]
623 pub named_variables: Option<i32>,
624
625 #[serde(rename = "indexedVariables", skip_serializing_if = "Option::is_none")]
631 #[builder(default)]
632 pub indexed_variables: Option<i32>,
633
634 #[serde(skip)]
635 #[builder(default, setter(skip))]
636 private: (),
637}
638impl From<SetExpressionResponseBody> for SuccessResponse {
639 fn from(args: SetExpressionResponseBody) -> Self {
640 Self::SetExpression(args)
641 }
642}
643
644#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
645pub struct SetFunctionBreakpointsResponseBody {
646 #[serde(rename = "breakpoints")]
648 pub breakpoints: Vec<Breakpoint>,
649
650 #[serde(skip)]
651 #[builder(default, setter(skip))]
652 private: (),
653}
654impl From<SetFunctionBreakpointsResponseBody> for SuccessResponse {
655 fn from(args: SetFunctionBreakpointsResponseBody) -> Self {
656 Self::SetFunctionBreakpoints(args)
657 }
658}
659
660#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
661pub struct SetInstructionBreakpointsResponseBody {
662 #[serde(rename = "breakpoints")]
664 pub breakpoints: Vec<Breakpoint>,
665
666 #[serde(skip)]
667 #[builder(default, setter(skip))]
668 private: (),
669}
670impl From<SetInstructionBreakpointsResponseBody> for SuccessResponse {
671 fn from(args: SetInstructionBreakpointsResponseBody) -> Self {
672 Self::SetInstructionBreakpoints(args)
673 }
674}
675
676#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
677pub struct SetVariableResponseBody {
678 #[serde(rename = "value")]
680 pub value: String,
681
682 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
684 #[builder(default)]
685 pub type_: Option<String>,
686
687 #[serde(rename = "variablesReference", skip_serializing_if = "Option::is_none")]
691 #[builder(default)]
692 pub variables_reference: Option<i32>,
693
694 #[serde(rename = "namedVariables", skip_serializing_if = "Option::is_none")]
700 #[builder(default)]
701 pub named_variables: Option<i32>,
702
703 #[serde(rename = "indexedVariables", skip_serializing_if = "Option::is_none")]
709 #[builder(default)]
710 pub indexed_variables: Option<i32>,
711
712 #[serde(skip)]
713 #[builder(default, setter(skip))]
714 private: (),
715}
716impl From<SetVariableResponseBody> for SuccessResponse {
717 fn from(args: SetVariableResponseBody) -> Self {
718 Self::SetVariable(args)
719 }
720}
721
722#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
723pub struct SourceResponseBody {
724 #[serde(rename = "content")]
726 pub content: String,
727
728 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
730 #[builder(default)]
731 pub mime_type: Option<String>,
732
733 #[serde(skip)]
734 #[builder(default, setter(skip))]
735 private: (),
736}
737impl From<SourceResponseBody> for SuccessResponse {
738 fn from(args: SourceResponseBody) -> Self {
739 Self::Source(args)
740 }
741}
742
743#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
744pub struct StackTraceResponseBody {
745 #[serde(rename = "stackFrames")]
749 pub stack_frames: Vec<StackFrame>,
750
751 #[serde(rename = "totalFrames", skip_serializing_if = "Option::is_none")]
753 #[builder(default)]
754 pub total_frames: Option<i32>,
755
756 #[serde(skip)]
757 #[builder(default, setter(skip))]
758 private: (),
759}
760impl From<StackTraceResponseBody> for SuccessResponse {
761 fn from(args: StackTraceResponseBody) -> Self {
762 Self::StackTrace(args)
763 }
764}
765
766#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
767pub struct StepInTargetsResponseBody {
768 #[serde(rename = "targets")]
770 pub targets: Vec<StepInTarget>,
771
772 #[serde(skip)]
773 #[builder(default, setter(skip))]
774 private: (),
775}
776impl From<StepInTargetsResponseBody> for SuccessResponse {
777 fn from(args: StepInTargetsResponseBody) -> Self {
778 Self::StepInTargets(args)
779 }
780}
781
782#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
783pub struct ThreadsResponseBody {
784 #[serde(rename = "threads")]
786 pub threads: Vec<Thread>,
787
788 #[serde(skip)]
789 #[builder(default, setter(skip))]
790 private: (),
791}
792impl From<ThreadsResponseBody> for SuccessResponse {
793 fn from(args: ThreadsResponseBody) -> Self {
794 Self::Threads(args)
795 }
796}
797
798#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
799pub struct VariablesResponseBody {
800 #[serde(rename = "variables")]
802 pub variables: Vec<Variable>,
803
804 #[serde(skip)]
805 #[builder(default, setter(skip))]
806 private: (),
807}
808impl From<VariablesResponseBody> for SuccessResponse {
809 fn from(args: VariablesResponseBody) -> Self {
810 Self::Variables(args)
811 }
812}
813
814fn deserialize_response_result<'de, D>(
818 deserializer: D,
819) -> Result<Result<SuccessResponse, ErrorResponse>, D::Error>
820where
821 D: Deserializer<'de>,
822{
823 let value = Value::deserialize(deserializer)?;
824
825 let success = value
826 .get("success")
827 .ok_or_else(|| Error::missing_field("success"))?
828 .as_bool()
829 .ok_or_else(|| Error::invalid_type(unexpected_value(&value), &"success bool"))?;
830
831 Ok(if success {
832 Ok(Deserialize::deserialize(value).map_err(|e| Error::custom(e.to_string()))?)
833 } else {
834 Err(Deserialize::deserialize(value).map_err(|e| Error::custom(e.to_string()))?)
835 })
836}
837
838fn unexpected_value<'l>(value: &'l Value) -> Unexpected<'l> {
839 match value {
840 Value::Null => Unexpected::Other("null"),
841 Value::Bool(b) => Unexpected::Bool(*b),
842 Value::Number(n) => unexpected_number(n),
843 Value::String(s) => Unexpected::Str(s),
844 Value::Array(_) => Unexpected::Seq,
845 Value::Object(_) => Unexpected::Map,
846 }
847}
848
849fn unexpected_number(number: &Number) -> Unexpected<'static> {
850 if number.is_f64() {
851 return Unexpected::Float(number.as_f64().unwrap());
852 }
853 if number.is_u64() {
854 return Unexpected::Unsigned(number.as_u64().unwrap());
855 }
856 if number.is_i64() {
857 return Unexpected::Signed(number.as_i64().unwrap());
858 }
859 panic!("Unknown number {}", number)
860}
861
862fn serialize_response_result<S>(
863 result: &Result<SuccessResponse, ErrorResponse>,
864 serializer: S,
865) -> Result<S::Ok, S::Error>
866where
867 S: Serializer,
868{
869 #[derive(Clone, Serialize)]
870 #[serde(untagged)]
871 enum Content<'l> {
872 Success(&'l SuccessResponse),
873 Error(&'l ErrorResponse),
874 }
875
876 #[derive(Clone, Serialize)]
877 struct TaggedContent<'l> {
878 success: bool,
879 #[serde(flatten)]
880 content: Content<'l>,
881 }
882
883 let serializable = match result {
884 Ok(response) => TaggedContent {
885 success: true,
886 content: Content::Success(response),
887 },
888 Err(response) => TaggedContent {
889 success: false,
890 content: Content::Error(response),
891 },
892 };
893 serializable.serialize(serializer)
894}