Skip to content

Commit 894bfcd

Browse files
committed
Add suffix customization to default formatter.
This defaults to the same suffix as before, \n. Supports several use cases: * When writing to a raw TTY, \r\n is required * Custom formatting of messages may be desirable, e.g. \n\n
1 parent 035cda8 commit 894bfcd

File tree

2 files changed

+66
-3
lines changed

2 files changed

+66
-3
lines changed

src/fmt/mod.rs

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ pub(crate) struct Builder {
144144
pub format_level: bool,
145145
pub format_indent: Option<usize>,
146146
pub custom_format: Option<FormatFn>,
147+
pub format_suffix: &'static str,
147148
built: bool,
148149
}
149150

@@ -155,6 +156,7 @@ impl Default for Builder {
155156
format_level: true,
156157
format_indent: Some(4),
157158
custom_format: None,
159+
format_suffix: "\n",
158160
built: false,
159161
}
160162
}
@@ -187,6 +189,7 @@ impl Builder {
187189
level: built.format_level,
188190
written_header_value: false,
189191
indent: built.format_indent,
192+
suffix: built.format_suffix,
190193
buf,
191194
};
192195

@@ -211,6 +214,7 @@ struct DefaultFormat<'a> {
211214
written_header_value: bool,
212215
indent: Option<usize>,
213216
buf: &'a mut Formatter,
217+
suffix: &'a str,
214218
}
215219

216220
impl<'a> DefaultFormat<'a> {
@@ -319,7 +323,7 @@ impl<'a> DefaultFormat<'a> {
319323
fn write_args(&mut self, record: &Record) -> io::Result<()> {
320324
match self.indent {
321325
// Fast path for no indentation
322-
None => writeln!(self.buf, "{}", record.args()),
326+
None => write!(self.buf, "{}{}", record.args(), self.suffix),
323327

324328
Some(indent_count) => {
325329
// Create a wrapper around the buffer only if we have to actually indent the message
@@ -334,7 +338,13 @@ impl<'a> DefaultFormat<'a> {
334338
let mut first = true;
335339
for chunk in buf.split(|&x| x == b'\n') {
336340
if !first {
337-
write!(self.fmt.buf, "\n{:width$}", "", width = self.indent_count)?;
341+
write!(
342+
self.fmt.buf,
343+
"{}{:width$}",
344+
self.fmt.suffix,
345+
"",
346+
width = self.indent_count
347+
)?;
338348
}
339349
self.fmt.buf.write_all(chunk)?;
340350
first = false;
@@ -357,7 +367,7 @@ impl<'a> DefaultFormat<'a> {
357367
write!(wrapper, "{}", record.args())?;
358368
}
359369

360-
writeln!(self.buf)?;
370+
write!(self.buf, "{}", self.suffix)?;
361371

362372
Ok(())
363373
}
@@ -402,6 +412,7 @@ mod tests {
402412
level: true,
403413
written_header_value: false,
404414
indent: None,
415+
suffix: "\n",
405416
buf: &mut f,
406417
});
407418

@@ -422,6 +433,7 @@ mod tests {
422433
level: false,
423434
written_header_value: false,
424435
indent: None,
436+
suffix: "\n",
425437
buf: &mut f,
426438
});
427439

@@ -442,6 +454,7 @@ mod tests {
442454
level: true,
443455
written_header_value: false,
444456
indent: Some(4),
457+
suffix: "\n",
445458
buf: &mut f,
446459
});
447460

@@ -462,6 +475,7 @@ mod tests {
462475
level: true,
463476
written_header_value: false,
464477
indent: Some(0),
478+
suffix: "\n",
465479
buf: &mut f,
466480
});
467481

@@ -482,9 +496,52 @@ mod tests {
482496
level: false,
483497
written_header_value: false,
484498
indent: Some(4),
499+
suffix: "\n",
485500
buf: &mut f,
486501
});
487502

488503
assert_eq!("log\n message\n", written);
489504
}
505+
506+
#[test]
507+
fn format_suffix() {
508+
let writer = writer::Builder::new()
509+
.write_style(WriteStyle::Never)
510+
.build();
511+
512+
let mut f = Formatter::new(&writer);
513+
514+
let written = write(DefaultFormat {
515+
timestamp: None,
516+
module_path: false,
517+
level: false,
518+
written_header_value: false,
519+
indent: None,
520+
suffix: "\n\n",
521+
buf: &mut f,
522+
});
523+
524+
assert_eq!("log\nmessage\n\n", written);
525+
}
526+
527+
#[test]
528+
fn format_suffix_with_indent() {
529+
let writer = writer::Builder::new()
530+
.write_style(WriteStyle::Never)
531+
.build();
532+
533+
let mut f = Formatter::new(&writer);
534+
535+
let written = write(DefaultFormat {
536+
timestamp: None,
537+
module_path: false,
538+
level: false,
539+
written_header_value: false,
540+
indent: Some(4),
541+
suffix: "\n\n",
542+
buf: &mut f,
543+
});
544+
545+
assert_eq!("log\n\n message\n\n", written);
546+
}
490547
}

src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,12 @@ impl Builder {
632632
self.format_timestamp(Some(fmt::TimestampPrecision::Nanos))
633633
}
634634

635+
/// Configures the end of line suffix.
636+
pub fn format_suffix(&mut self, suffix: &'static str) -> &mut Self {
637+
self.format.format_suffix = suffix;
638+
self
639+
}
640+
635641
/// Adds a directive to the filter for a specific module.
636642
///
637643
/// # Examples

0 commit comments

Comments
 (0)