11use std:: {
2+ fmt,
23 sync:: { mpsc, Arc , Barrier , OnceLock } ,
34 thread,
45} ;
@@ -116,30 +117,49 @@ struct PrintMessage {
116117}
117118
118119impl PrintMessage {
119- fn to_formatted_message ( & self ) -> Option < String > {
120- if ! is_running_in_accessible_mode ( ) && ! should_display_log ( & self . level ) {
121- return None ;
120+ fn should_display ( & self ) -> bool {
121+ if self . level == MessageLevel :: Quiet {
122+ return false ;
122123 }
123124
125+ if !should_display_log ( & self . level ) && !is_running_in_accessible_mode ( ) {
126+ return false ;
127+ }
128+
129+ if self . level == MessageLevel :: Info {
130+ return !is_running_in_accessible_mode ( ) || self . accessible ;
131+ }
132+
133+ true
134+ }
135+ }
136+
137+ impl fmt:: Display for PrintMessage {
138+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
139+ debug_assert ! (
140+ self . should_display( ) ,
141+ "Display called on message that shouldn't be displayed"
142+ ) ;
143+
124144 match self . level {
125145 MessageLevel :: Info => {
126146 if !is_running_in_accessible_mode ( ) {
127- Some ( format ! ( "{}[INFO]{} {}" , * GREEN , * RESET , self . contents) )
147+ write ! ( f , "{}[INFO]{} {}" , * GREEN , * RESET , self . contents) ? ;
128148 } else if self . accessible {
129- Some ( format ! ( "{}Info:{} {}" , * GREEN , * RESET , self . contents) )
130- } else {
131- None
149+ write ! ( f, "{}Info:{} {}" , * GREEN , * RESET , self . contents) ?;
132150 }
133151 }
134152 MessageLevel :: Warning => {
135153 if is_running_in_accessible_mode ( ) {
136- Some ( format ! ( "{}Warning:{} {}" , * ORANGE , * RESET , self . contents) )
154+ write ! ( f , "{}Warning:{} {}" , * ORANGE , * RESET , self . contents) ? ;
137155 } else {
138- Some ( format ! ( "{}[WARNING]{} {}" , * ORANGE , * RESET , self . contents) )
156+ write ! ( f , "{}[WARNING]{} {}" , * ORANGE , * RESET , self . contents) ? ;
139157 }
140158 }
141- MessageLevel :: Quiet => None ,
159+ MessageLevel :: Quiet => { }
142160 }
161+
162+ Ok ( ( ) )
143163 }
144164}
145165
@@ -152,6 +172,7 @@ enum MessageLevel {
152172
153173mod logger_thread {
154174 use std:: {
175+ io:: { self , Write } ,
155176 sync:: { mpsc:: RecvTimeoutError , Arc , Barrier } ,
156177 time:: Duration ,
157178 } ;
@@ -224,13 +245,13 @@ mod logger_thread {
224245 fn run_logger ( log_receiver : LogReceiver ) {
225246 const FLUSH_TIMEOUT : Duration = Duration :: from_millis ( 200 ) ;
226247
227- let mut buffer = Vec :: < String > :: with_capacity ( 16 ) ;
248+ let mut writer = io :: BufWriter :: new ( io :: stderr ( ) ) ;
228249
229250 loop {
230251 let msg = match log_receiver. recv_timeout ( FLUSH_TIMEOUT ) {
231252 Ok ( msg) => msg,
232253 Err ( RecvTimeoutError :: Timeout ) => {
233- flush_logs_to_stderr ( & mut buffer ) ;
254+ writer . flush ( ) . unwrap ( ) ;
234255 continue ;
235256 }
236257 Err ( RecvTimeoutError :: Disconnected ) => unreachable ! ( "sender is static" ) ,
@@ -239,32 +260,20 @@ mod logger_thread {
239260 match msg {
240261 LoggerCommand :: Print ( msg) => {
241262 // Append message to buffer
242- if let Some ( msg) = msg. to_formatted_message ( ) {
243- buffer. push ( msg) ;
244- }
245-
246- if buffer. len ( ) == buffer. capacity ( ) {
247- flush_logs_to_stderr ( & mut buffer) ;
263+ if msg. should_display ( ) {
264+ writeln ! ( writer, "{msg}" ) . unwrap ( ) ;
248265 }
249266 }
250267 LoggerCommand :: Flush { finished_barrier } => {
251- flush_logs_to_stderr ( & mut buffer ) ;
268+ writer . flush ( ) . unwrap ( ) ;
252269 finished_barrier. wait ( ) ;
253270 }
254271 LoggerCommand :: FlushAndShutdown { finished_barrier } => {
255- flush_logs_to_stderr ( & mut buffer ) ;
272+ writer . flush ( ) . unwrap ( ) ;
256273 finished_barrier. wait ( ) ;
257274 return ;
258275 }
259276 }
260277 }
261278 }
262-
263- fn flush_logs_to_stderr ( buffer : & mut Vec < String > ) {
264- if !buffer. is_empty ( ) {
265- let text = buffer. join ( "\n " ) ;
266- eprintln ! ( "{text}" ) ;
267- buffer. clear ( ) ;
268- }
269- }
270279}
0 commit comments