From 78180884c6c11950559ff97b727db6bdb4b3d2f4 Mon Sep 17 00:00:00 2001 From: Joel Depooter Date: Tue, 25 Feb 2025 11:30:59 -0800 Subject: [PATCH] Handle carriage returns in source JSON whitespace Previously any carriage return (\r) bytes in the JSON whitespace were not ignored. Instead they were included in the formatted output. This led to very bad formatting, as the indentation would include the carriage return. With this change, carriage returns are handled the same way that newlines are: they are ignored in the source JSON whitespace. It might be better to detect if the source JSON is using Windows (\r\n) newlines, and preserve that on the output. However, that is a much bigger change. For now I think it is sufficient to simply produce necely formatted output which uses only \n newlines. --- src/lib.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 172d68b..9362b99 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -88,7 +88,7 @@ where match char { b'"' => in_string = true, - b' ' | b'\n' | b'\t' => continue, + b' ' | b'\n' | b'\r' | b'\t' => continue, b'[' => { indent_level += 1; request_newline = true; @@ -245,4 +245,21 @@ mod test { assert_eq!(expected, format(expected, Indentation::TwoSpace)); } + + #[test] + fn contains_crlf() { + let json = "[\r\n{\r\n\"a\":0\r\n},\r\n{},\r\n{\r\n\"a\": null\r\n}\r\n]\r\n"; + let expected = "[ + { + \"a\": 0 + }, + {}, + { + \"a\": null + } +] +"; + + assert_eq!(expected, format(json, Indentation::TwoSpace)); + } }