Skip to content

Commit e07fb7c

Browse files
committed
Check invariant during deserialization
1 parent 3a1089a commit e07fb7c

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/serde_impls.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use {
22
crate::{TextRange, TextSize},
3-
serde::{Deserialize, Deserializer, Serialize, Serializer},
3+
serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer},
44
};
55

66
impl Serialize for TextSize {
@@ -35,6 +35,13 @@ impl<'de> Deserialize<'de> for TextRange {
3535
where
3636
D: Deserializer<'de>,
3737
{
38-
Deserialize::deserialize(deserializer).map(|(start, end)| TextRange(start, end))
38+
let (start, end) = Deserialize::deserialize(deserializer)?;
39+
if !(start <= end) {
40+
return Err(Error::custom(format!(
41+
"invalid range: {:?}..{:?}",
42+
start, end
43+
)));
44+
}
45+
Ok(TextRange(start, end))
3946
}
4047
}

tests/serde.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,25 @@ fn range_serialization() {
5555
],
5656
);
5757
}
58+
59+
#[test]
60+
fn invalid_range_deserialization() {
61+
assert_tokens::<TextRange>(
62+
&range(62..92),
63+
&[
64+
Token::Tuple { len: 2 },
65+
Token::U32(62),
66+
Token::U32(92),
67+
Token::TupleEnd,
68+
],
69+
);
70+
assert_de_tokens_error::<TextRange>(
71+
&[
72+
Token::Tuple { len: 2 },
73+
Token::U32(92),
74+
Token::U32(62),
75+
Token::TupleEnd,
76+
],
77+
"invalid range: 92..62",
78+
);
79+
}

0 commit comments

Comments
 (0)