From 90c1892668ccedbda93c0486ecbca7a1f716a919 Mon Sep 17 00:00:00 2001
From: Tangent 128 <Tangent128@gmail.com>
Date: Mon, 2 Apr 2018 19:12:28 -0400
Subject: [PATCH] Commonize some code for EbmlCursor

---
 src/iterator.rs | 33 ++++++++++++++++-----------------
 src/webm.rs     |  4 ++--
 2 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/src/iterator.rs b/src/iterator.rs
index 29e19a8..a668835 100644
--- a/src/iterator.rs
+++ b/src/iterator.rs
@@ -17,32 +17,31 @@ impl<S> EbmlCursor<S> {
     }
 }
 
+impl<'a> EbmlCursor<&'a [u8]> {
+    fn decode_element<T: FromEbml<'a>>(&mut self) -> Result<Option<T>, EbmlError> {
+        match T::decode_element(&self.source.as_ref()[self.position..]) {
+            Err(err) => Err(err),
+            Ok(None) => Ok(None),
+            Ok(Some((element, element_size))) => {
+                self.position += element_size;
+                Ok(Some(element))
+            }
+        }
+    }
+}
+
 impl<'a> Iterator for EbmlCursor<&'a [u8]> {
     type Item = WebmElement<'a>;
 
     fn next(&mut self) -> Option<WebmElement<'a>> {
-        match Self::Item::decode_element(&self.source.as_ref()[self.position..]) {
-            Err(_) => None,
-            Ok(None) => None,
-            Ok(Some((element, element_size))) => {
-                self.position += element_size;
-                Some(element)
-            }
-        }
+        self.decode_element().unwrap_or(None)
     }
 }
 
-impl<'b, S: AsRef<[u8]>> WebmEventSource for EbmlCursor<S> {
+impl<'b> WebmEventSource for EbmlCursor<&'b [u8]> {
     type Error = EbmlError;
 
     fn poll_event<'a>(&'a mut self) -> Result<Async<Option<WebmElement<'a>>>, EbmlError> {
-        match WebmElement::decode_element(&self.source.as_ref()[self.position..]) {
-            Err(err) => Err(err),
-            Ok(None) => Ok(Async::Ready(None)),
-            Ok(Some((element, element_size))) => {
-                self.position += element_size;
-                Ok(Async::Ready(Some(element)))
-            }
-        }
+        self.decode_element().map(Async::Ready)
     }
 }
diff --git a/src/webm.rs b/src/webm.rs
index bce0a05..338723f 100644
--- a/src/webm.rs
+++ b/src/webm.rs
@@ -13,8 +13,8 @@ const CLUSTER_ID: u64 = 0x0F43B675;
 const TIMECODE_ID: u64 = 0x67;
 const SIMPLE_BLOCK_ID: u64 = 0x23;
 
-pub fn parse_webm<T: AsRef<[u8]>>(source: T) -> EbmlCursor<T> {
-    EbmlCursor::new(source)
+pub fn parse_webm<'a, T: AsRef<[u8]> + ?Sized>(source: &'a T) -> EbmlCursor<&'a [u8]> {
+    EbmlCursor::new(source.as_ref())
 }
 
 #[derive(Debug, PartialEq, Copy, Clone)]