use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; use std::path::PathBuf; #[derive( Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize, )] pub struct ThreadId(isize); impl std::fmt::Display for ThreadId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.0.fmt(f) } } pub type ThreadStates = HashMap; pub trait Request { type Arguments: serde::de::DeserializeOwned + serde::Serialize; type Result: serde::de::DeserializeOwned + serde::Serialize; const COMMAND: &'static str; } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ColumnDescriptor { pub attribute_name: String, pub label: String, #[serde(skip_serializing_if = "Option::is_none")] pub format: Option, #[serde(rename = "type", skip_serializing_if = "Option::is_none")] pub ty: Option, #[serde(skip_serializing_if = "Option::is_none")] pub width: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ExceptionBreakpointsFilter { pub filter: String, pub label: String, #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, #[serde(skip_serializing_if = "Option::is_none")] pub default: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_condition: Option, #[serde(skip_serializing_if = "Option::is_none")] pub condition_description: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct DebuggerCapabilities { #[serde(skip_serializing_if = "Option::is_none")] pub supports_configuration_done_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_function_breakpoints: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_conditional_breakpoints: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_hit_conditional_breakpoints: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_evaluate_for_hovers: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_step_back: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_set_variable: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_restart_frame: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_goto_targets_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_step_in_targets_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_completions_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_modules_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_restart_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_exception_options: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_value_formatting_options: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_exception_info_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub support_terminate_debuggee: Option, #[serde(skip_serializing_if = "Option::is_none")] pub support_suspend_debuggee: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_delayed_stack_trace_loading: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_loaded_sources_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_log_points: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_terminate_threads_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_set_expression: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_terminate_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_data_breakpoints: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_read_memory_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_write_memory_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_disassemble_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_cancel_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_breakpoint_locations_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_clipboard_context: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_stepping_granularity: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_instruction_breakpoints: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_exception_filter_options: Option, #[serde(skip_serializing_if = "Option::is_none")] pub exception_breakpoint_filters: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub completion_trigger_characters: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub additional_module_columns: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub supported_checksum_algorithms: Option>, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Checksum { pub algorithm: String, pub checksum: String, } #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Source { #[serde(skip_serializing_if = "Option::is_none")] pub name: Option, #[serde(skip_serializing_if = "Option::is_none")] pub path: Option, #[serde(skip_serializing_if = "Option::is_none")] pub source_reference: Option, #[serde(skip_serializing_if = "Option::is_none")] pub presentation_hint: Option, #[serde(skip_serializing_if = "Option::is_none")] pub origin: Option, #[serde(skip_serializing_if = "Option::is_none")] pub sources: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub adapter_data: Option, #[serde(skip_serializing_if = "Option::is_none")] pub checksums: Option>, } #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SourceBreakpoint { pub line: usize, #[serde(skip_serializing_if = "Option::is_none")] pub column: Option, #[serde(skip_serializing_if = "Option::is_none")] pub condition: Option, #[serde(skip_serializing_if = "Option::is_none")] pub hit_condition: Option, #[serde(skip_serializing_if = "Option::is_none")] pub log_message: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Breakpoint { #[serde(skip_serializing_if = "Option::is_none")] pub id: Option, pub verified: bool, #[serde(skip_serializing_if = "Option::is_none")] pub message: Option, #[serde(skip_serializing_if = "Option::is_none")] pub source: Option, #[serde(skip_serializing_if = "Option::is_none")] pub line: Option, #[serde(skip_serializing_if = "Option::is_none")] pub column: Option, #[serde(skip_serializing_if = "Option::is_none")] pub end_line: Option, #[serde(skip_serializing_if = "Option::is_none")] pub end_column: Option, #[serde(skip_serializing_if = "Option::is_none")] pub instruction_reference: Option, #[serde(skip_serializing_if = "Option::is_none")] pub offset: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct StackFrameFormat { #[serde(skip_serializing_if = "Option::is_none")] pub parameters: Option, #[serde(skip_serializing_if = "Option::is_none")] pub parameter_types: Option, #[serde(skip_serializing_if = "Option::is_none")] pub parameter_names: Option, #[serde(skip_serializing_if = "Option::is_none")] pub parameter_values: Option, #[serde(skip_serializing_if = "Option::is_none")] pub line: Option, #[serde(skip_serializing_if = "Option::is_none")] pub module: Option, #[serde(skip_serializing_if = "Option::is_none")] pub include_all: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct StackFrame { pub id: usize, pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub source: Option, pub line: usize, pub column: usize, #[serde(skip_serializing_if = "Option::is_none")] pub end_line: Option, #[serde(skip_serializing_if = "Option::is_none")] pub end_column: Option, #[serde(skip_serializing_if = "Option::is_none")] pub can_restart: Option, #[serde(skip_serializing_if = "Option::is_none")] pub instruction_pointer_reference: Option, #[serde(skip_serializing_if = "Option::is_none")] pub module_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub presentation_hint: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Thread { pub id: ThreadId, pub name: String, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Scope { pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub presentation_hint: Option, pub variables_reference: usize, #[serde(skip_serializing_if = "Option::is_none")] pub named_variables: Option, #[serde(skip_serializing_if = "Option::is_none")] pub indexed_variables: Option, pub expensive: bool, #[serde(skip_serializing_if = "Option::is_none")] pub source: Option, #[serde(skip_serializing_if = "Option::is_none")] pub line: Option, #[serde(skip_serializing_if = "Option::is_none")] pub column: Option, #[serde(skip_serializing_if = "Option::is_none")] pub end_line: Option, #[serde(skip_serializing_if = "Option::is_none")] pub end_column: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ValueFormat { #[serde(skip_serializing_if = "Option::is_none")] pub hex: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct VariablePresentationHint { #[serde(skip_serializing_if = "Option::is_none")] pub kind: Option, #[serde(skip_serializing_if = "Option::is_none")] pub attributes: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub visibility: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Variable { pub name: String, pub value: String, #[serde(rename = "type", skip_serializing_if = "Option::is_none")] pub ty: Option, #[serde(skip_serializing_if = "Option::is_none")] pub presentation_hint: Option, #[serde(skip_serializing_if = "Option::is_none")] pub evaluate_name: Option, pub variables_reference: usize, #[serde(skip_serializing_if = "Option::is_none")] pub named_variables: Option, #[serde(skip_serializing_if = "Option::is_none")] pub indexed_variables: Option, #[serde(skip_serializing_if = "Option::is_none")] pub memory_reference: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Module { pub id: String, // TODO: || number pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub path: Option, #[serde(skip_serializing_if = "Option::is_none")] pub is_optimized: Option, #[serde(skip_serializing_if = "Option::is_none")] pub is_user_code: Option, #[serde(skip_serializing_if = "Option::is_none")] pub version: Option, #[serde(skip_serializing_if = "Option::is_none")] pub symbol_status: Option, #[serde(skip_serializing_if = "Option::is_none")] pub symbol_file_path: Option, #[serde(skip_serializing_if = "Option::is_none")] pub date_time_stamp: Option, #[serde(skip_serializing_if = "Option::is_none")] pub address_range: Option, } pub mod requests { use super::*; #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct InitializeArguments { #[serde(rename = "clientID", skip_serializing_if = "Option::is_none")] pub client_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub client_name: Option, #[serde(rename = "adapterID")] pub adapter_id: String, #[serde(skip_serializing_if = "Option::is_none")] pub locale: Option, #[serde(rename = "linesStartAt1", skip_serializing_if = "Option::is_none")] pub lines_start_at_one: Option, #[serde(rename = "columnsStartAt1", skip_serializing_if = "Option::is_none")] pub columns_start_at_one: Option, #[serde(skip_serializing_if = "Option::is_none")] pub path_format: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_variable_type: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_variable_paging: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_run_in_terminal_request: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_memory_references: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_progress_reporting: Option, #[serde(skip_serializing_if = "Option::is_none")] pub supports_invalidated_event: Option, } #[derive(Debug)] pub enum Initialize {} impl Request for Initialize { type Arguments = InitializeArguments; type Result = DebuggerCapabilities; const COMMAND: &'static str = "initialize"; } #[derive(Debug)] pub enum Launch {} impl Request for Launch { type Arguments = Value; type Result = (); const COMMAND: &'static str = "launch"; } #[derive(Debug)] pub enum Attach {} impl Request for Attach { type Arguments = Value; type Result = (); const COMMAND: &'static str = "attach"; } #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct DisconnectArguments { #[serde(skip_serializing_if = "Option::is_none")] pub restart: Option, #[serde(skip_serializing_if = "Option::is_none")] pub terminate_debuggee: Option, #[serde(skip_serializing_if = "Option::is_none")] pub suspend_debuggee: Option, } #[derive(Debug)] pub enum Restart {} impl Request for Restart { type Arguments = Value; type Result = (); const COMMAND: &'static str = "restart"; } #[derive(Debug)] pub enum Disconnect {} impl Request for Disconnect { type Arguments = Option; type Result = (); const COMMAND: &'static str = "disconnect"; } #[derive(Debug)] pub enum ConfigurationDone {} impl Request for ConfigurationDone { type Arguments = (); type Result = (); const COMMAND: &'static str = "configurationDone"; } #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetBreakpointsArguments { pub source: Source, #[serde(skip_serializing_if = "Option::is_none")] pub breakpoints: Option>, // lines is deprecated #[serde(skip_serializing_if = "Option::is_none")] pub source_modified: Option, } #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetBreakpointsResponse { #[serde(skip_serializing_if = "Option::is_none")] pub breakpoints: Option>, } #[derive(Debug)] pub enum SetBreakpoints {} impl Request for SetBreakpoints { type Arguments = SetBreakpointsArguments; type Result = SetBreakpointsResponse; const COMMAND: &'static str = "setBreakpoints"; } #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ContinueArguments { pub thread_id: ThreadId, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ContinueResponse { #[serde(skip_serializing_if = "Option::is_none")] pub all_threads_continued: Option, } #[derive(Debug)] pub enum Continue {} impl Request for Continue { type Arguments = ContinueArguments; type Result = ContinueResponse; const COMMAND: &'static str = "continue"; } #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct StackTraceArguments { pub thread_id: ThreadId, #[serde(skip_serializing_if = "Option::is_none")] pub start_frame: Option, #[serde(skip_serializing_if = "Option::is_none")] pub levels: Option, #[serde(skip_serializing_if = "Option::is_none")] pub format: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct StackTraceResponse { #[serde(skip_serializing_if = "Option::is_none")] pub total_frames: Option, pub stack_frames: Vec, } #[derive(Debug)] pub enum StackTrace {} impl Request for StackTrace { type Arguments = StackTraceArguments; type Result = StackTraceResponse; const COMMAND: &'static str = "stackTrace"; } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ThreadsResponse { pub threads: Vec, } #[derive(Debug)] pub enum Threads {} impl Request for Threads { type Arguments = (); type Result = ThreadsResponse; const COMMAND: &'static str = "threads"; } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ScopesArguments { pub frame_id: usize, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ScopesResponse { pub scopes: Vec, } #[derive(Debug)] pub enum Scopes {} impl Request for Scopes { type Arguments = ScopesArguments; type Result = ScopesResponse; const COMMAND: &'static str = "scopes"; } #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct VariablesArguments { pub variables_reference: usize, #[serde(skip_serializing_if = "Option::is_none")] pub filter: Option, #[serde(skip_serializing_if = "Option::is_none")] pub start: Option, #[serde(skip_serializing_if = "Option::is_none")] pub count: Option, #[serde(skip_serializing_if = "Option::is_none")] pub format: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct VariablesResponse { pub variables: Vec, } #[derive(Debug)] pub enum Variables {} impl Request for Variables { type Arguments = VariablesArguments; type Result = VariablesResponse; const COMMAND: &'static str = "variables"; } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct StepInArguments { pub thread_id: ThreadId, #[serde(skip_serializing_if = "Option::is_none")] pub target_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub granularity: Option, } #[derive(Debug)] pub enum StepIn {} impl Request for StepIn { type Arguments = StepInArguments; type Result = (); const COMMAND: &'static str = "stepIn"; } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct StepOutArguments { pub thread_id: ThreadId, #[serde(skip_serializing_if = "Option::is_none")] pub granularity: Option, } #[derive(Debug)] pub enum StepOut {} impl Request for StepOut { type Arguments = StepOutArguments; type Result = (); const COMMAND: &'static str = "stepOut"; } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct NextArguments { pub thread_id: ThreadId, #[serde(skip_serializing_if = "Option::is_none")] pub granularity: Option, } #[derive(Debug)] pub enum Next {} impl Request for Next { type Arguments = NextArguments; type Result = (); const COMMAND: &'static str = "next"; } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct PauseArguments { pub thread_id: ThreadId, } #[derive(Debug)] pub enum Pause {} impl Request for Pause { type Arguments = PauseArguments; type Result = (); const COMMAND: &'static str = "pause"; } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct EvaluateArguments { pub expression: String, #[serde(skip_serializing_if = "Option::is_none")] pub frame_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub context: Option, #[serde(skip_serializing_if = "Option::is_none")] pub format: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct EvaluateResponse { pub result: String, #[serde(rename = "type", skip_serializing_if = "Option::is_none")] pub ty: Option, #[serde(skip_serializing_if = "Option::is_none")] pub presentation_hint: Option, pub variables_reference: usize, #[serde(skip_serializing_if = "Option::is_none")] pub named_variables: Option, #[serde(skip_serializing_if = "Option::is_none")] pub indexed_variables: Option, #[serde(skip_serializing_if = "Option::is_none")] pub memory_reference: Option, } #[derive(Debug)] pub enum Evaluate {} impl Request for Evaluate { type Arguments = EvaluateArguments; type Result = EvaluateResponse; const COMMAND: &'static str = "evaluate"; } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetExceptionBreakpointsArguments { pub filters: Vec, // pub filterOptions: Option>, // needs capability // pub exceptionOptions: Option>, // needs capability } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetExceptionBreakpointsResponse { #[serde(skip_serializing_if = "Option::is_none")] pub breakpoints: Option>, } #[derive(Debug)] pub enum SetExceptionBreakpoints {} impl Request for SetExceptionBreakpoints { type Arguments = SetExceptionBreakpointsArguments; type Result = SetExceptionBreakpointsResponse; const COMMAND: &'static str = "setExceptionBreakpoints"; } // Reverse Requests #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct RunInTerminalResponse { #[serde(skip_serializing_if = "Option::is_none")] pub process_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub shell_process_id: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct RunInTerminalArguments { #[serde(skip_serializing_if = "Option::is_none")] pub kind: Option, #[serde(skip_serializing_if = "Option::is_none")] pub title: Option, pub cwd: String, pub args: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub env: Option>>, } #[derive(Debug)] pub enum RunInTerminal {} impl Request for RunInTerminal { type Arguments = RunInTerminalArguments; type Result = RunInTerminalResponse; const COMMAND: &'static str = "runInTerminal"; } } // Events pub mod events { use super::*; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[serde(tag = "event", content = "body")] // seq is omitted as unused and is not sent by some implementations pub enum Event { Initialized(Option), Stopped(Stopped), Continued(Continued), Exited(Exited), Terminated(Option), Thread(Thread), Output(Output), Breakpoint(Breakpoint), Module(Module), LoadedSource(LoadedSource), Process(Process), Capabilities(Capabilities), // ProgressStart(), // ProgressUpdate(), // ProgressEnd(), // Invalidated(), Memory(Memory), } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Stopped { pub reason: String, #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, #[serde(skip_serializing_if = "Option::is_none")] pub thread_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub preserve_focus_hint: Option, #[serde(skip_serializing_if = "Option::is_none")] pub text: Option, #[serde(skip_serializing_if = "Option::is_none")] pub all_threads_stopped: Option, #[serde(skip_serializing_if = "Option::is_none")] pub hit_breakpoint_ids: Option>, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Continued { pub thread_id: ThreadId, #[serde(skip_serializing_if = "Option::is_none")] pub all_threads_continued: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Exited { pub exit_code: usize, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Terminated { #[serde(skip_serializing_if = "Option::is_none")] pub restart: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Thread { pub reason: String, pub thread_id: ThreadId, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Output { pub output: String, #[serde(skip_serializing_if = "Option::is_none")] pub category: Option, #[serde(skip_serializing_if = "Option::is_none")] pub group: Option, #[serde(skip_serializing_if = "Option::is_none")] pub line: Option, #[serde(skip_serializing_if = "Option::is_none")] pub column: Option, #[serde(skip_serializing_if = "Option::is_none")] pub variables_reference: Option, #[serde(skip_serializing_if = "Option::is_none")] pub source: Option, #[serde(skip_serializing_if = "Option::is_none")] pub data: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Breakpoint { pub reason: String, pub breakpoint: super::Breakpoint, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Module { pub reason: String, pub module: super::Module, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct LoadedSource { pub reason: String, pub source: super::Source, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Process { pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub system_process_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub is_local_process: Option, #[serde(skip_serializing_if = "Option::is_none")] pub start_method: Option, // TODO: use enum #[serde(skip_serializing_if = "Option::is_none")] pub pointer_size: Option, } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Capabilities { pub capabilities: super::DebuggerCapabilities, } // #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] // #[serde(rename_all = "camelCase")] // pub struct Invalidated { // pub areas: Vec, // pub thread_id: Option, // pub stack_frame_id: Option, // } #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Memory { pub memory_reference: String, pub offset: usize, pub count: usize, } }