From 3a9e1c305b1ab080e77a2d6a405710fd1f20015e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Hrastnik?= Date: Mon, 16 Aug 2021 13:37:50 +0900 Subject: [PATCH] Refactor types, add a Request trait --- helix-dap/src/client.rs | 28 +- helix-dap/src/lib.rs | 2 +- helix-dap/src/types.rs | 716 ++++++++++++++++++++++------------------ 3 files changed, 407 insertions(+), 339 deletions(-) diff --git a/helix-dap/src/client.rs b/helix-dap/src/client.rs index a0133d7d..5046159c 100644 --- a/helix-dap/src/client.rs +++ b/helix-dap/src/client.rs @@ -3,8 +3,8 @@ use crate::{ types::*, Result, }; -use log::{error, info}; -use serde::{Deserialize, Serialize}; +pub use log::{error, info}; +use serde::Serialize; use serde_json::{from_value, to_value, Value}; use std::{ collections::HashMap, @@ -208,7 +208,7 @@ impl Client { } pub async fn initialize(&mut self, adapter_id: String) -> Result<()> { - let args = InitializeArguments { + let args = requests::InitializeArguments { client_id: Some("hx".to_owned()), client_name: Some("helix".to_owned()), adapter_id, @@ -262,7 +262,7 @@ impl Client { file: String, breakpoints: Vec, ) -> Result>> { - let args = SetBreakpointsArguments { + let args = requests::SetBreakpointsArguments { source: Source { path: Some(file), name: None, @@ -280,7 +280,7 @@ impl Client { let response = self .request("setBreakpoints".to_owned(), to_value(args).ok()) .await?; - let body: Option = from_value(response.body.unwrap()).ok(); + let body: Option = from_value(response.body.unwrap()).ok(); Ok(body.map(|b| b.breakpoints).unwrap()) } @@ -291,13 +291,13 @@ impl Client { } pub async fn continue_thread(&mut self, thread_id: usize) -> Result> { - let args = ContinueArguments { thread_id }; + let args = requests::ContinueArguments { thread_id }; let response = self .request("continue".to_owned(), to_value(args).ok()) .await?; - let body: Option = from_value(response.body.unwrap()).ok(); + let body: Option = from_value(response.body.unwrap()).ok(); Ok(body.map(|b| b.all_threads_continued).unwrap()) } @@ -306,7 +306,7 @@ impl Client { &mut self, thread_id: usize, ) -> Result<(Vec, Option)> { - let args = StackTraceArguments { + let args = requests::StackTraceArguments { thread_id, start_frame: None, levels: None, @@ -317,7 +317,7 @@ impl Client { .request("stackTrace".to_owned(), to_value(args).ok()) .await?; - let body: StackTraceResponseBody = from_value(response.body.unwrap()).unwrap(); + let body: requests::StackTraceResponse = from_value(response.body.unwrap()).unwrap(); Ok((body.stack_frames, body.total_frames)) } @@ -325,25 +325,25 @@ impl Client { pub async fn threads(&mut self) -> Result> { let response = self.request("threads".to_owned(), None).await?; - let body: ThreadsResponseBody = from_value(response.body.unwrap()).unwrap(); + let body: requests::ThreadsResponse = from_value(response.body.unwrap()).unwrap(); Ok(body.threads) } pub async fn scopes(&mut self, frame_id: usize) -> Result> { - let args = ScopesArguments { frame_id }; + let args = requests::ScopesArguments { frame_id }; let response = self .request("scopes".to_owned(), to_value(args).ok()) .await?; - let body: ScopesResponseBody = from_value(response.body.unwrap()).unwrap(); + let body: requests::ScopesResponse = from_value(response.body.unwrap()).unwrap(); Ok(body.scopes) } pub async fn variables(&mut self, variables_reference: usize) -> Result> { - let args = VariablesArguments { + let args = requests::VariablesArguments { variables_reference, filter: None, start: None, @@ -355,7 +355,7 @@ impl Client { .request("variables".to_owned(), to_value(args).ok()) .await?; - let body: VariablesResponseBody = from_value(response.body.unwrap()).unwrap(); + let body: requests::VariablesResponse = from_value(response.body.unwrap()).unwrap(); Ok(body.variables) } diff --git a/helix-dap/src/lib.rs b/helix-dap/src/lib.rs index 04d9ba8b..64cc87cc 100644 --- a/helix-dap/src/lib.rs +++ b/helix-dap/src/lib.rs @@ -3,7 +3,7 @@ mod transport; mod types; pub use client::Client; -pub use transport::{Event, Payload, Request, Response, Transport}; +pub use transport::{Event, Payload, Response, Transport}; pub use types::*; use thiserror::Error; diff --git a/helix-dap/src/types.rs b/helix-dap/src/types.rs index 6b2d4975..3f7e3c43 100644 --- a/helix-dap/src/types.rs +++ b/helix-dap/src/types.rs @@ -1,324 +1,392 @@ -use serde::{Deserialize, Serialize}; -use serde_json::Value; - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ColumnDescriptor { - pub attribute_name: String, - pub label: String, - pub format: Option, - #[serde(rename = "type")] - pub col_type: Option, - pub width: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ExceptionBreakpointsFilter { - pub filter: String, - pub label: String, - pub description: Option, - pub default: Option, - pub supports_condition: Option, - pub condition_description: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DebuggerCapabilities { - pub supports_configuration_done_request: Option, - pub supports_function_breakpoints: Option, - pub supports_conditional_breakpoints: Option, - pub supports_hit_conditional_breakpoints: Option, - pub supports_evaluate_for_hovers: Option, - pub supports_step_back: Option, - pub supports_set_variable: Option, - pub supports_restart_frame: Option, - pub supports_goto_targets_request: Option, - pub supports_step_in_targets_request: Option, - pub supports_completions_request: Option, - pub supports_modules_request: Option, - pub supports_restart_request: Option, - pub supports_exception_options: Option, - pub supports_value_formatting_options: Option, - pub supports_exception_info_request: Option, - pub support_terminate_debuggee: Option, - pub support_suspend_debuggee: Option, - pub supports_delayed_stack_trace_loading: Option, - pub supports_loaded_sources_request: Option, - pub supports_log_points: Option, - pub supports_terminate_threads_request: Option, - pub supports_set_expression: Option, - pub supports_terminate_request: Option, - pub supports_data_breakpoints: Option, - pub supports_read_memory_request: Option, - pub supports_write_memory_request: Option, - pub supports_disassemble_request: Option, - pub supports_cancel_request: Option, - pub supports_breakpoint_locations_request: Option, - pub supports_clipboard_context: Option, - pub supports_stepping_granularity: Option, - pub supports_instruction_breakpoints: Option, - pub supports_exception_filter_options: Option, - pub exception_breakpoint_filters: Option>, - pub completion_trigger_characters: Option>, - pub additional_module_columns: Option>, - pub supported_checksum_algorithms: Option>, -} - -impl std::ops::Deref for DebuggerCapabilities { - type Target = Option; - - fn deref(&self) -> &Self::Target { - &self.supports_exception_options - } -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct InitializeArguments { - #[serde(rename = "clientID")] - pub client_id: Option, - pub client_name: Option, - #[serde(rename = "adapterID")] - pub adapter_id: String, - pub locale: Option, - #[serde(rename = "linesStartAt1")] - pub lines_start_at_one: Option, - #[serde(rename = "columnsStartAt1")] - pub columns_start_at_one: Option, - pub path_format: Option, - pub supports_variable_type: Option, - pub supports_variable_paging: Option, - pub supports_run_in_terminal_request: Option, - pub supports_memory_references: Option, - pub supports_progress_reporting: Option, - pub supports_invalidated_event: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Checksum { - pub algorithm: String, - pub checksum: String, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Source { - pub name: Option, - pub path: Option, - pub source_reference: Option, - pub presentation_hint: Option, - pub origin: Option, - pub sources: Option>, - pub adapter_data: Option, - pub checksums: Option>, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct SourceBreakpoint { - pub line: usize, - pub column: Option, - pub condition: Option, - pub hit_condition: Option, - pub log_message: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct SetBreakpointsArguments { - pub source: Source, - pub breakpoints: Option>, - // lines is deprecated - pub source_modified: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Breakpoint { - pub id: Option, - pub verified: bool, - pub message: Option, - pub source: Option, - pub line: Option, - pub column: Option, - pub end_line: Option, - pub end_column: Option, - pub instruction_reference: Option, - pub offset: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct SetBreakpointsResponseBody { - pub breakpoints: Option>, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ContinueArguments { - pub thread_id: usize, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ContinueResponseBody { - pub all_threads_continued: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct StackFrameFormat { - pub parameters: Option, - pub parameter_types: Option, - pub parameter_names: Option, - pub parameter_values: Option, - pub line: Option, - pub module: Option, - pub include_all: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct StackTraceArguments { - pub thread_id: usize, - pub start_frame: Option, - pub levels: Option, - pub format: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct StackFrame { - pub id: usize, - pub name: String, - pub source: Option, - pub line: usize, - pub column: usize, - pub end_line: Option, - pub end_column: Option, - pub can_restart: Option, - pub instruction_pointer_reference: Option, - pub module_id: Option, - pub presentation_hint: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct StackTraceResponseBody { - pub total_frames: Option, - pub stack_frames: Vec, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Thread { - pub id: usize, - pub name: String, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ThreadsResponseBody { - pub threads: Vec, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ScopesArguments { - pub frame_id: usize, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Scope { - pub name: String, - pub presentation_hint: Option, - pub variables_reference: usize, - pub named_variables: Option, - pub indexed_variables: Option, - pub expensive: bool, - pub source: Option, - pub line: Option, - pub column: Option, - pub end_line: Option, - pub end_column: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ScopesResponseBody { - pub scopes: Vec, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ValueFormat { - pub hex: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct VariablesArguments { - pub variables_reference: usize, - pub filter: Option, - pub start: Option, - pub count: Option, - pub format: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct VariablePresentationHint { - pub kind: Option, - pub attributes: Option>, - pub visibility: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Variable { - pub name: String, - pub value: String, - #[serde(rename = "type")] - pub data_type: Option, - pub presentation_hint: Option, - pub evaluate_name: Option, - pub variables_reference: usize, - pub named_variables: Option, - pub indexed_variables: Option, - pub memory_reference: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct VariablesResponseBody { - pub variables: Vec, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct OutputEventBody { - pub output: String, - pub category: Option, - pub group: Option, - pub line: Option, - pub column: Option, - pub variables_reference: Option, - pub source: Option, - pub data: Option, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct StoppedEventBody { - pub reason: String, - pub description: Option, - pub thread_id: Option, - pub preserve_focus_hint: Option, - pub text: Option, - pub all_threads_stopped: Option, - pub hit_breakpoint_ids: Option>, -} +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +pub trait Request { + type Arguments: serde::de::DeserializeOwned + serde::Serialize; + type Result: serde::de::DeserializeOwned + serde::Serialize; + const COMMAND: &'static str; +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ColumnDescriptor { + pub attribute_name: String, + pub label: String, + pub format: Option, + #[serde(rename = "type")] + pub col_type: Option, + pub width: Option, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ExceptionBreakpointsFilter { + pub filter: String, + pub label: String, + pub description: Option, + pub default: Option, + pub supports_condition: Option, + pub condition_description: Option, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct DebuggerCapabilities { + pub supports_configuration_done_request: Option, + pub supports_function_breakpoints: Option, + pub supports_conditional_breakpoints: Option, + pub supports_hit_conditional_breakpoints: Option, + pub supports_evaluate_for_hovers: Option, + pub supports_step_back: Option, + pub supports_set_variable: Option, + pub supports_restart_frame: Option, + pub supports_goto_targets_request: Option, + pub supports_step_in_targets_request: Option, + pub supports_completions_request: Option, + pub supports_modules_request: Option, + pub supports_restart_request: Option, + pub supports_exception_options: Option, + pub supports_value_formatting_options: Option, + pub supports_exception_info_request: Option, + pub support_terminate_debuggee: Option, + pub support_suspend_debuggee: Option, + pub supports_delayed_stack_trace_loading: Option, + pub supports_loaded_sources_request: Option, + pub supports_log_points: Option, + pub supports_terminate_threads_request: Option, + pub supports_set_expression: Option, + pub supports_terminate_request: Option, + pub supports_data_breakpoints: Option, + pub supports_read_memory_request: Option, + pub supports_write_memory_request: Option, + pub supports_disassemble_request: Option, + pub supports_cancel_request: Option, + pub supports_breakpoint_locations_request: Option, + pub supports_clipboard_context: Option, + pub supports_stepping_granularity: Option, + pub supports_instruction_breakpoints: Option, + pub supports_exception_filter_options: Option, + pub exception_breakpoint_filters: Option>, + pub completion_trigger_characters: Option>, + pub additional_module_columns: Option>, + pub supported_checksum_algorithms: Option>, +} + +impl std::ops::Deref for DebuggerCapabilities { + type Target = Option; + + fn deref(&self) -> &Self::Target { + &self.supports_exception_options + } +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Checksum { + pub algorithm: String, + pub checksum: String, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Source { + pub name: Option, + pub path: Option, + pub source_reference: Option, + pub presentation_hint: Option, + pub origin: Option, + pub sources: Option>, + pub adapter_data: Option, + pub checksums: Option>, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct SourceBreakpoint { + pub line: usize, + pub column: Option, + pub condition: Option, + pub hit_condition: Option, + pub log_message: Option, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Breakpoint { + pub id: Option, + pub verified: bool, + pub message: Option, + pub source: Option, + pub line: Option, + pub column: Option, + pub end_line: Option, + pub end_column: Option, + pub instruction_reference: Option, + pub offset: Option, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct StackFrameFormat { + pub parameters: Option, + pub parameter_types: Option, + pub parameter_names: Option, + pub parameter_values: Option, + pub line: Option, + pub module: Option, + pub include_all: Option, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct StackFrame { + pub id: usize, + pub name: String, + pub source: Option, + pub line: usize, + pub column: usize, + pub end_line: Option, + pub end_column: Option, + pub can_restart: Option, + pub instruction_pointer_reference: Option, + pub module_id: Option, + pub presentation_hint: Option, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Thread { + pub id: usize, + pub name: String, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Scope { + pub name: String, + pub presentation_hint: Option, + pub variables_reference: usize, + pub named_variables: Option, + pub indexed_variables: Option, + pub expensive: bool, + pub source: Option, + pub line: Option, + pub column: Option, + pub end_line: Option, + pub end_column: Option, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ValueFormat { + pub hex: Option, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct VariablePresentationHint { + pub kind: Option, + pub attributes: Option>, + pub visibility: Option, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Variable { + pub name: String, + pub value: String, + #[serde(rename = "type")] + pub data_type: Option, + pub presentation_hint: Option, + pub evaluate_name: Option, + pub variables_reference: usize, + pub named_variables: Option, + pub indexed_variables: Option, + pub memory_reference: Option, +} + +pub mod requests { + use super::*; + #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct InitializeArguments { + #[serde(rename = "clientID")] + pub client_id: Option, + pub client_name: Option, + #[serde(rename = "adapterID")] + pub adapter_id: String, + pub locale: Option, + #[serde(rename = "linesStartAt1")] + pub lines_start_at_one: Option, + #[serde(rename = "columnsStartAt1")] + pub columns_start_at_one: Option, + pub path_format: Option, + pub supports_variable_type: Option, + pub supports_variable_paging: Option, + pub supports_run_in_terminal_request: Option, + pub supports_memory_references: Option, + pub supports_progress_reporting: Option, + pub supports_invalidated_event: Option, + } + + #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct SetBreakpointsArguments { + pub source: Source, + pub breakpoints: Option>, + // lines is deprecated + pub source_modified: Option, + } + + #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct SetBreakpointsResponse { + 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, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct ContinueArguments { + pub thread_id: usize, + } + + #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct ContinueResponse { + 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, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct StackTraceArguments { + pub thread_id: usize, + pub start_frame: Option, + pub levels: Option, + pub format: Option, + } + + #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct StackTraceResponse { + 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, 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, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct ScopesArguments { + pub frame_id: usize, + } + + #[derive(Debug, PartialEq, 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, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct VariablesArguments { + pub variables_reference: usize, + pub filter: Option, + pub start: Option, + pub count: Option, + pub format: Option, + } + + #[derive(Debug, PartialEq, 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 = "scopes"; + } +} + +// Events + +pub mod events { + use super::*; + #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct Output { + pub output: String, + pub category: Option, + pub group: Option, + pub line: Option, + pub column: Option, + pub variables_reference: Option, + pub source: Option, + pub data: Option, + } + + #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct Stopped { + pub reason: String, + pub description: Option, + pub thread_id: Option, + pub preserve_focus_hint: Option, + pub text: Option, + pub all_threads_stopped: Option, + pub hit_breakpoint_ids: Option>, + } +}