@@ -4,7 +4,6 @@ use std::{
44} ;
55
66use anyhow:: Context ;
7- use spmc:: Receiver ;
87use transport:: {
98 requests:: { self , Disconnect , Initialize , PathFormat } ,
109 Client ,
@@ -18,30 +17,44 @@ use crate::{
1817
1918pub struct Debugger {
2019 internals : Arc < Mutex < DebuggerInternals > > ,
20+ rx : spmc:: Receiver < Event > ,
2121}
2222
2323impl Debugger {
24- #[ tracing:: instrument( skip( client, events, publisher ) ) ]
24+ #[ tracing:: instrument( skip( client, events) ) ]
2525 pub fn new (
2626 client : Client ,
27- events : Receiver < transport:: events:: Event > ,
28- mut publisher : spmc:: Sender < Event > ,
27+ events : spmc:: Receiver < transport:: events:: Event > ,
2928 ) -> anyhow:: Result < Self > {
3029 tracing:: debug!( "creating new client" ) ;
3130
32- let _ = publisher. send ( Event :: Uninitialised ) ;
31+ let ( mut tx, rx) = spmc:: channel ( ) ;
32+ let _ = tx. send ( Event :: Uninitialised ) ;
3333
34- let internals = Arc :: new ( Mutex :: new ( DebuggerInternals :: new ( client, publisher) ) ) ;
34+ let internals_rx = rx. clone ( ) ;
35+ let internals = Arc :: new ( Mutex :: new ( DebuggerInternals :: new ( client, tx) ) ) ;
3536
3637 // background thread reading transport events, and handling the event with our internal state
3738 let background_internals = Arc :: clone ( & internals) ;
39+ let background_events = events. clone ( ) ;
3840 thread:: spawn ( move || loop {
39- let event = events . recv ( ) . unwrap ( ) ;
41+ let event = background_events . recv ( ) . unwrap ( ) ;
4042 background_internals. lock ( ) . unwrap ( ) . on_event ( event) ;
4143 } ) ;
42- Ok ( Self { internals } )
44+ Ok ( Self {
45+ internals,
46+ rx : internals_rx,
47+ } )
4348 }
4449
50+ pub fn events ( & self ) -> spmc:: Receiver < Event > {
51+ self . rx . clone ( )
52+ }
53+
54+ // fn emit(&self, event: Event) {
55+ // self.internals.lock().unwrap().emit(event)
56+ // }
57+
4558 pub fn initialise ( & self , launch_arguments : state:: LaunchArguments ) -> anyhow:: Result < ( ) > {
4659 // initialise
4760 let req = requests:: RequestBody :: Initialize ( Initialize {
@@ -110,6 +123,27 @@ impl Debugger {
110123 fn execute ( & self , body : requests:: RequestBody ) -> anyhow:: Result < ( ) > {
111124 self . internals . lock ( ) . unwrap ( ) . client . execute ( body)
112125 }
126+
127+ pub fn wait_for_event < F > ( & self , pred : F ) -> Event
128+ where
129+ F : Fn ( & Event ) -> bool ,
130+ {
131+ let mut n = 0 ;
132+ loop {
133+ let evt = self . rx . recv ( ) . unwrap ( ) ;
134+ if n >= 100 {
135+ panic ! ( "did not receive event" ) ;
136+ }
137+
138+ if pred ( & evt) {
139+ tracing:: debug!( event = ?evt, "received expected event" ) ;
140+ return evt;
141+ } else {
142+ tracing:: trace!( event = ?evt, "non-matching event" ) ;
143+ }
144+ n += 1 ;
145+ }
146+ }
113147}
114148
115149impl Drop for Debugger {
0 commit comments