mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-13 20:41:02 +00:00
Invalid-length when enum seq is too short
This commit is contained in:
@@ -395,6 +395,7 @@ fn deserialize_seq(
|
|||||||
fields: &[Field],
|
fields: &[Field],
|
||||||
is_struct: bool,
|
is_struct: bool,
|
||||||
) -> P<ast::Expr> {
|
) -> P<ast::Expr> {
|
||||||
|
let mut index_in_seq = 0usize;
|
||||||
let let_values: Vec<_> = fields.iter()
|
let let_values: Vec<_> = fields.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, field)| {
|
.map(|(i, field)| {
|
||||||
@@ -420,14 +421,16 @@ fn deserialize_seq(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
quote_stmt!(cx,
|
let assign = quote_stmt!(cx,
|
||||||
let $name = match $visit {
|
let $name = match $visit {
|
||||||
Some(value) => { value },
|
Some(value) => { value },
|
||||||
None => {
|
None => {
|
||||||
return Err(_serde::de::Error::end_of_stream());
|
return Err(_serde::de::Error::invalid_length($index_in_seq));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
).unwrap()
|
).unwrap();
|
||||||
|
index_in_seq += 1;
|
||||||
|
assign
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|||||||
@@ -946,3 +946,31 @@ fn test_missing_renamed_field_enum() {
|
|||||||
Error::MissingField("d"),
|
Error::MissingField("d"),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
|
enum InvalidLengthEnum {
|
||||||
|
A(i32, i32, i32),
|
||||||
|
B(#[serde(skip_deserializing)] i32, i32, i32),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_invalid_length_enum() {
|
||||||
|
assert_de_tokens_error::<InvalidLengthEnum>(
|
||||||
|
&[
|
||||||
|
Token::EnumSeqStart("InvalidLengthEnum", "A", Some(3)),
|
||||||
|
Token::EnumSeqSep,
|
||||||
|
Token::I32(1),
|
||||||
|
Token::EnumSeqEnd,
|
||||||
|
],
|
||||||
|
Error::InvalidLength(1),
|
||||||
|
);
|
||||||
|
assert_de_tokens_error::<InvalidLengthEnum>(
|
||||||
|
&[
|
||||||
|
Token::EnumSeqStart("InvalidLengthEnum", "B", Some(3)),
|
||||||
|
Token::EnumSeqSep,
|
||||||
|
Token::I32(1),
|
||||||
|
Token::EnumSeqEnd,
|
||||||
|
],
|
||||||
|
Error::InvalidLength(1),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user