summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmer Katz <omer.drow@gmail.com>2019-02-28 16:49:58 +0200
committerOmer Katz <omer.drow@gmail.com>2019-03-03 23:51:12 +0200
commit98478e195d1e35cd69ed42d97c524b422c884bac (patch)
tree4000b68f2bcaecd607f545c666760d44ae960f87
parent5517f89c4d376a6cddc9e8f568fbbda67974ec7b (diff)
downloadpy-amqp-98478e195d1e35cd69ed42d97c524b422c884bac.tar.gz
Begin reimplementing array.
-rw-r--r--src/lib.rs38
1 files changed, 28 insertions, 10 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 7f14b57..1eeeeee 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -111,6 +111,26 @@ impl<'deserializer_l> AMQPDeserializer<'deserializer_l> {
}
#[inline]
+ fn read_timestamp(&mut self) -> io::Result<PyObject> {
+ self.reset_bitmap();
+ let timestamp = self.cursor.read_u64::<BigEndian>()?;;
+ Ok(DATETIME_CLASS.call_method(
+ *self.py,
+ "utcfromtimestamp",
+ (timestamp,),
+ None
+ )?)
+ }
+
+ #[inline]
+ fn read_item(&mut self) -> io::Result<PyObject> {
+ let ftype = self.cursor.read_u8()? as char;
+ match ftype {
+ _ => Ok(self.py.None()) // TODO: Return error
+ }
+ }
+
+ #[inline]
fn read_frame(&mut self) -> io::Result<&PyDict> {
self.reset_bitmap();
Ok(PyDict::new(*self.py))
@@ -119,7 +139,13 @@ impl<'deserializer_l> AMQPDeserializer<'deserializer_l> {
#[inline]
fn read_array(&mut self) -> io::Result<&PyList> {
self.reset_bitmap();
- Ok(PyList::empty(*self.py))
+ let array = PyList::empty(*self.py);
+ let array_length = self.cursor.read_u32::<BigEndian>()? as u64;
+ let limit = self.cursor.position() + array_length;
+ while self.cursor.position() < limit {
+ array.append(self.read_item()?)?;
+ }
+ Ok(array)
}
fn deserialize(&mut self) -> io::Result<(&'deserializer_l PyList, u64)> {
@@ -172,15 +198,7 @@ impl<'deserializer_l> AMQPDeserializer<'deserializer_l> {
}
},
'T' => {
- self.reset_bitmap();
- let timestamp = self.cursor.read_u64::<BigEndian>()?;;
- let val = DATETIME_CLASS.call_method(
- *self.py,
- "utcfromtimestamp",
- (timestamp,),
- None
- )?;
- values.append(val)?;
+ values.append(self.read_timestamp()?)?;
},
'F' => {
values.append(self.read_frame()?)?;