Debugger State ============== {{#include ../../links.md}} Sometimes it is useful to keep a persistent _state_ within the [debugger]. The `Engine::register_debugger` API accepts a function that returns the initial value of the [debugger's][debugger] state, which is a [`Dynamic`] and can hold any value. This state value is the stored into the [debugger]'s custom state. Access the Debugger State ------------------------- Use `EvalContext::global_runtime_state().debugger()` (immutable) or `EvalContext::global_runtime_state_mut().debugger_mut()` (mutable) to gain access to the current [`debugger::Debugger`] instance. The following [`debugger::Debugger`] methods allow access to the custom [debugger] state. | Method | Parameter type | Return type | Description | | ----------- | :-------------------------------: | :-------------------------: | ----------------------------------------------- | | `state` | _none_ | [`&Dynamic`][`Dynamic`] | returns the custom state | | `state_mut` | _none_ | [`&mut Dynamic`][`Dynamic`] | returns a mutable reference to the custom state | | `set_state` | [`impl Into`][`Dynamic`] | _none_ | sets the value of the custom state | Example ------- ```rust engine.register_debugger( |engine, mut debugger| { // Say, use an object map for the debugger state let mut state = Map::new(); // Initialize properties state.insert("hello".into(), 42_64.into()); state.insert("foo".into(), false.into()); debugger.set_state(state); debugger }, |context, node, source, pos| { // Print debugger state - which is an object map let state = context.global_runtime_state().debugger().state(); println!("Current state = {state}"); // Get the state as an object map let mut state = context.global_runtime_state_mut() .debugger_mut().state_mut() .write_lock::().unwrap(); // Read state let hello = state.get("hello").unwrap().as_int().unwrap(); // Modify state state.insert("hello".into(), (hello + 1).into()); state.insert("foo".into(), true.into()); state.insert("something_new".into(), "hello, world!".into()); // Continue with debugging Ok(DebuggerCommand::StepInto) } ); ```