diff --git a/src/de.rs b/src/de.rs index c6a171f..a60fa38 100644 --- a/src/de.rs +++ b/src/de.rs @@ -23,7 +23,7 @@ impl<'de> Depythonizer<'de> { } fn sequence_access(&self, expected_len: Option) -> Result> { - let seq: &PySequence = self.input.downcast()?; + let seq: &PyIterator = self.input.iter()?; let len = self.input.len()?; match expected_len { @@ -289,13 +289,13 @@ impl<'a, 'de> de::Deserializer<'de> for &'a mut Depythonizer<'de> { } struct PySequenceAccess<'a> { - seq: &'a PySequence, + seq: &'a PyIterator, index: usize, len: usize, } impl<'a> PySequenceAccess<'a> { - fn new(seq: &'a PySequence, len: usize) -> Self { + fn new(seq: &'a PyIterator, len: usize) -> Self { Self { seq, index: 0, len } } } @@ -308,7 +308,11 @@ impl<'de> de::SeqAccess<'de> for PySequenceAccess<'de> { T: de::DeserializeSeed<'de>, { if self.index < self.len { - let mut item_de = Depythonizer::from_object(self.seq.get_item(self.index)?); + let item = match self.seq.next() { + Some(item) => item?, + None => return Ok(None), + }; + let mut item_de = Depythonizer::from_object(item); self.index += 1; seed.deserialize(&mut item_de).map(Some) } else { @@ -558,6 +562,22 @@ mod test { test_de(code, &expected, &expected_json); } + #[test] + fn test_tuple_from_pyset() { + let expected = ("foo".to_string(), 5); + let expected_json = json!(["foo", 5]); + let code = "{'foo', 5}"; + test_de(code, &expected, &expected_json); + } + + #[test] + fn test_tuple_from_pyfrozenset() { + let expected = ("foo".to_string(), 5); + let expected_json = json!(["foo", 5]); + let code = "frozenset({'foo', 5})"; + test_de(code, &expected, &expected_json); + } + #[test] fn test_vec() { let expected = vec![3, 2, 1];