nu_protocol/debugger/
debugger_trait.rs1use crate::{
17 PipelineData, ShellError, Span, Value,
18 ast::{Block, PipelineElement},
19 engine::EngineState,
20 ir::IrBlock,
21};
22use std::{fmt::Debug, ops::DerefMut};
23
24pub trait DebugContext: Clone + Copy + Debug {
31 #[allow(unused_variables)]
33 fn enter_block(engine_state: &EngineState, block: &Block) {}
34
35 #[allow(unused_variables)]
37 fn leave_block(engine_state: &EngineState, block: &Block) {}
38
39 #[allow(unused_variables)]
41 fn enter_element(engine_state: &EngineState, element: &PipelineElement) {}
42
43 #[allow(unused_variables)]
45 fn leave_element(
46 engine_state: &EngineState,
47 element: &PipelineElement,
48 result: &Result<PipelineData, ShellError>,
49 ) {
50 }
51
52 #[allow(unused_variables)]
54 fn enter_instruction(
55 engine_state: &EngineState,
56 ir_block: &IrBlock,
57 instruction_index: usize,
58 registers: &[PipelineData],
59 ) {
60 }
61
62 #[allow(unused_variables)]
64 fn leave_instruction(
65 engine_state: &EngineState,
66 ir_block: &IrBlock,
67 instruction_index: usize,
68 registers: &[PipelineData],
69 error: Option<&ShellError>,
70 ) {
71 }
72}
73
74#[derive(Clone, Copy, Debug)]
78pub struct WithDebug;
79
80impl DebugContext for WithDebug {
81 fn enter_block(engine_state: &EngineState, block: &Block) {
82 if let Ok(mut debugger) = engine_state.debugger.lock() {
83 debugger.deref_mut().enter_block(engine_state, block);
84 }
85 }
86
87 fn leave_block(engine_state: &EngineState, block: &Block) {
88 if let Ok(mut debugger) = engine_state.debugger.lock() {
89 debugger.deref_mut().leave_block(engine_state, block);
90 }
91 }
92
93 fn enter_element(engine_state: &EngineState, element: &PipelineElement) {
94 if let Ok(mut debugger) = engine_state.debugger.lock() {
95 debugger.deref_mut().enter_element(engine_state, element);
96 }
97 }
98
99 fn leave_element(
100 engine_state: &EngineState,
101 element: &PipelineElement,
102 result: &Result<PipelineData, ShellError>,
103 ) {
104 if let Ok(mut debugger) = engine_state.debugger.lock() {
105 debugger
106 .deref_mut()
107 .leave_element(engine_state, element, result);
108 }
109 }
110
111 fn enter_instruction(
112 engine_state: &EngineState,
113 ir_block: &IrBlock,
114 instruction_index: usize,
115 registers: &[PipelineData],
116 ) {
117 if let Ok(mut debugger) = engine_state.debugger.lock() {
118 debugger.deref_mut().enter_instruction(
119 engine_state,
120 ir_block,
121 instruction_index,
122 registers,
123 )
124 }
125 }
126
127 fn leave_instruction(
128 engine_state: &EngineState,
129 ir_block: &IrBlock,
130 instruction_index: usize,
131 registers: &[PipelineData],
132 error: Option<&ShellError>,
133 ) {
134 if let Ok(mut debugger) = engine_state.debugger.lock() {
135 debugger.deref_mut().leave_instruction(
136 engine_state,
137 ir_block,
138 instruction_index,
139 registers,
140 error,
141 )
142 }
143 }
144}
145
146#[derive(Clone, Copy, Debug)]
150pub struct WithoutDebug;
151
152impl DebugContext for WithoutDebug {}
153
154pub trait Debugger: Send + Debug {
158 fn activate(&mut self) {}
162
163 fn deactivate(&mut self) {}
168
169 #[allow(unused_variables)]
171 fn enter_block(&mut self, engine_state: &EngineState, block: &Block) {}
172
173 #[allow(unused_variables)]
175 fn leave_block(&mut self, engine_state: &EngineState, block: &Block) {}
176
177 #[allow(unused_variables)]
179 fn enter_element(&mut self, engine_state: &EngineState, pipeline_element: &PipelineElement) {}
180
181 #[allow(unused_variables)]
183 fn leave_element(
184 &mut self,
185 engine_state: &EngineState,
186 element: &PipelineElement,
187 result: &Result<PipelineData, ShellError>,
188 ) {
189 }
190
191 #[allow(unused_variables)]
193 fn enter_instruction(
194 &mut self,
195 engine_state: &EngineState,
196 ir_block: &IrBlock,
197 instruction_index: usize,
198 registers: &[PipelineData],
199 ) {
200 }
201
202 #[allow(unused_variables)]
204 fn leave_instruction(
205 &mut self,
206 engine_state: &EngineState,
207 ir_block: &IrBlock,
208 instruction_index: usize,
209 registers: &[PipelineData],
210 error: Option<&ShellError>,
211 ) {
212 }
213
214 #[allow(unused_variables)]
218 fn report(&self, engine_state: &EngineState, debugger_span: Span) -> Result<Value, ShellError> {
219 Ok(Value::nothing(debugger_span))
220 }
221}
222
223#[derive(Debug)]
227pub struct NoopDebugger;
228
229impl Debugger for NoopDebugger {}