chiark / gitweb /
response plumbing
[hippotat.git] / src / queue.rs
index 5e22de9fb21eebfa40366e8945be27a6e87a1d5a..3a85f5c27b1886b3863ca22e033386a849ecc26b 100644 (file)
@@ -23,6 +23,12 @@ impl<D> PacketQueue<D> where D: AsRef<[u8]> {
     Some(data)
   }
 
+  pub fn content_count(&self) -> usize { self.queue.len() }
+  pub fn content_len(&self) -> usize { self.content }
+  pub fn total_len(&self) -> usize {
+    self.content_count() + self.content_len()
+  }
+
   pub fn is_empty(&self) -> bool { self.queue.is_empty() }
   pub fn peek_front(&self) -> Option<&D> { self.queue.front() }
 }
@@ -53,7 +59,7 @@ impl<E> QueueBuf<E> where E: AsRef<[u8]> {
   pub fn push<B: Into<E>>(&mut self, b: B) {
     self.push_(b.into());
   }
-  pub fn push_(&mut self, b: E) {
+  fn push_(&mut self, b: E) {
     let l = b.as_ref().len();
     self.queue.push_back(b);
     self.content += l;
@@ -63,25 +69,24 @@ impl<E> QueueBuf<E> where E: AsRef<[u8]> {
 }
 
 impl FrameQueueBuf {
-  pub fn push<B: Into<Box<[u8]>>>(&mut self, b: B) {
-    self.push_(b.into());
+  pub fn push_esc<B: Into<Box<[u8]>>>(&mut self, b: B) {
+    self.push_esc_(b.into());
   }
-  pub fn push_(&mut self, b: Box<[u8]>) {
+  fn push_esc_(&mut self, b: Box<[u8]>) {
     self.queue.push_(Cervine::Owned(b));
     self.queue.push_(Cervine::Borrowed(&SLIP_END_SLICE));
   }
+  pub fn esc_push(&mut self, b: Box<[u8]>) {
+    self.queue.push_(Cervine::Borrowed(&SLIP_END_SLICE));
+    self.queue.push_(Cervine::Owned(b));
+  }
+  pub fn push_raw(&mut self, b: Box<[u8]>) {
+    self.queue.push_(Cervine::Owned(b));
+  }
   pub fn is_empty(&self) -> bool { self.queue.is_empty() }
   pub fn len(&self) -> usize { self.queue.len() }
 }
 
-impl<E> Extend<E> for FrameQueueBuf where E: Into<Box<[u8]>> {
-  fn extend<I>(&mut self, it: I)
-  where I: IntoIterator<Item=E>
-  {
-    for b in it { self.push(b) }
-  }
-}
-
 impl<E> hyper::body::Buf for QueueBuf<E> where E: AsRef<[u8]> {
   fn remaining(&self) -> usize { self.content }
   fn chunk(&self) -> &[u8] {
@@ -119,7 +124,7 @@ impl BufBody<FrameQueueBuf> {
   pub fn display<S:Display>(s: S) -> Self {
     let s = s.to_string().into_bytes();
     let mut buf: FrameQueueBuf = default();
-    buf.push(s);
+    buf.push_raw(s.into());
     Self::new(buf)
   }
 }