@@ -31,6 +31,7 @@ mod must_initialize;
3131mod platform;
3232mod python;
3333mod shared;
34+ mod stdio_stream;
3435mod terminal;
3536
3637pub fn debug_server ( matches : & ArgMatches ) -> Result < ( ) , Error > {
@@ -63,46 +64,52 @@ pub fn debug_server(matches: &ArgMatches) -> Result<(), Error> {
6364 debugger. command_interpreter ( ) . handle_command ( & command, & mut command_result, false ) ;
6465 }
6566
66- let ( port, connect) = if let Some ( port) = matches. value_of ( "connect" ) {
67- ( port. parse ( ) ?, true )
67+ let ( use_stdio , port, connect) = if let Some ( port) = matches. value_of ( "connect" ) {
68+ ( false , port. parse ( ) ?, true )
6869 } else if let Some ( port) = matches. value_of ( "port" ) {
69- ( port. parse ( ) ?, false )
70+ ( false , port. parse ( ) ?, false )
7071 } else {
71- return Err ( "Either --connect or --port must be specified" . into ( ) ) ;
72+ ( true , 0 , false )
7273 } ;
7374 let multi_session = matches. is_present ( "multi-session" ) ;
7475 let auth_token = matches. value_of ( "auth-token" ) ;
7576
76- let localhost = net:: Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ;
77- let addr = net:: SocketAddr :: new ( localhost. into ( ) , port) ;
78-
7977 let rt = tokio:: runtime:: Builder :: new_multi_thread ( ) //
8078 . worker_threads ( 2 )
8179 . enable_all ( )
8280 . build ( )
8381 . unwrap ( ) ;
8482
8583 rt. block_on ( async {
86- if connect {
87- debug ! ( "Connecting to {}" , addr) ;
88- let mut tcp_stream = TcpStream :: connect ( addr) . await ?;
89- tcp_stream. set_nodelay ( true ) . unwrap ( ) ;
90- if let Some ( auth_token) = auth_token {
91- let auth_header = format ! ( "Auth-Token: {}\r \n " , auth_token) ;
92- tcp_stream. write_all ( & auth_header. as_bytes ( ) ) . await ?;
93- }
94- let framed_stream = dap_codec:: DAPCodec :: new ( ) . framed ( tcp_stream) ;
84+ if use_stdio {
85+ debug ! ( "Starting on stdio" ) ;
86+ let stream = stdio_stream:: StdioStream :: new ( ) ;
87+ let framed_stream = dap_codec:: DAPCodec :: new ( ) . framed ( stream) ;
9588 run_debug_session ( Box :: new ( framed_stream) , adapter_settings. clone ( ) ) . await ;
9689 } else {
97- let listener = TcpListener :: bind ( & addr) . await ?;
98- while {
99- debug ! ( "Listening on {}" , listener. local_addr( ) ?) ;
100- let ( tcp_stream, _) = listener. accept ( ) . await ?;
90+ let localhost = net:: Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ;
91+ let addr = net:: SocketAddr :: new ( localhost. into ( ) , port) ;
92+ if connect {
93+ debug ! ( "Connecting to {}" , addr) ;
94+ let mut tcp_stream = TcpStream :: connect ( addr) . await ?;
10195 tcp_stream. set_nodelay ( true ) . unwrap ( ) ;
96+ if let Some ( auth_token) = auth_token {
97+ let auth_header = format ! ( "Auth-Token: {}\r \n " , auth_token) ;
98+ tcp_stream. write_all ( & auth_header. as_bytes ( ) ) . await ?;
99+ }
102100 let framed_stream = dap_codec:: DAPCodec :: new ( ) . framed ( tcp_stream) ;
103101 run_debug_session ( Box :: new ( framed_stream) , adapter_settings. clone ( ) ) . await ;
104- multi_session
105- } { }
102+ } else {
103+ let listener = TcpListener :: bind ( & addr) . await ?;
104+ while {
105+ debug ! ( "Listening on {}" , listener. local_addr( ) ?) ;
106+ let ( tcp_stream, _) = listener. accept ( ) . await ?;
107+ tcp_stream. set_nodelay ( true ) . unwrap ( ) ;
108+ let framed_stream = dap_codec:: DAPCodec :: new ( ) . framed ( tcp_stream) ;
109+ run_debug_session ( Box :: new ( framed_stream) , adapter_settings. clone ( ) ) . await ;
110+ multi_session
111+ } { }
112+ }
106113 }
107114 Ok :: < ( ) , Error > ( ( ) )
108115 } )
0 commit comments