aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Huss <eric@huss.org>2019-08-13 13:48:54 -0700
committerEric Huss <eric@huss.org>2019-08-13 13:48:54 -0700
commitf4dd4a2438c0000846a6bfd21d8b18dc47f280cf (patch)
tree7c401dc26a6cdb947a279fe964f72d06f275d5bb
parentd03b251af5f935ea8363ebc59f1caddf99feb790 (diff)
downloadmilf-rs-f4dd4a2438c0000846a6bfd21d8b18dc47f280cf.tar.gz
milf-rs-f4dd4a2438c0000846a6bfd21d8b18dc47f280cf.zip
Fix error line/column when using CRLF line endings.
-rw-r--r--src/de.rs5
-rw-r--r--test-suite/tests/de-errors.rs27
2 files changed, 31 insertions, 1 deletions
diff --git a/src/de.rs b/src/de.rs
index 234fa50..e71cd0c 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -1775,7 +1775,10 @@ impl<'a> Deserializer<'a> {
/// All indexes are 0-based.
fn to_linecol(&self, offset: usize) -> (usize, usize) {
let mut cur = 0;
- for (i, line) in self.input.lines().enumerate() {
+ // Use split_terminator instead of lines so that if there is a `\r`,
+ // it is included in the offset calculation. The `+1` values below
+ // account for the `\n`.
+ for (i, line) in self.input.split_terminator('\n').enumerate() {
if cur + line.len() + 1 > offset {
return (i, offset - cur);
}
diff --git a/test-suite/tests/de-errors.rs b/test-suite/tests/de-errors.rs
index 7cceb7b..5005313 100644
--- a/test-suite/tests/de-errors.rs
+++ b/test-suite/tests/de-errors.rs
@@ -323,3 +323,30 @@ fn serde_derive_deserialize_errors() {
"invalid type: integer `1`, expected a string for key `p_b` at line 4 column 34"
);
}
+
+#[test]
+fn error_handles_crlf() {
+ bad!(
+ "\r\n\
+ [t1]\r\n\
+ [t2]\r\n\
+ a = 1\r\n\
+ a = 2\r\n\
+ ",
+ toml::Value,
+ "duplicate key: `a` for key `t2` at line 3 column 1"
+ );
+
+ // Should be the same as above.
+ bad!(
+ "\n\
+ [t1]\n\
+ [t2]\n\
+ a = 1\n\
+ a = 2\n\
+ ",
+ toml::Value,
+ "duplicate key: `a` for key `t2` at line 3 column 1"
+ );
+
+}