diff options
Diffstat (limited to 'ebml/src/lib.rs')
-rw-r--r-- | ebml/src/lib.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/ebml/src/lib.rs b/ebml/src/lib.rs index 116b8e2..acebae3 100644 --- a/ebml/src/lib.rs +++ b/ebml/src/lib.rs @@ -47,3 +47,34 @@ impl EbmlReader { }) } } + +pub trait ValueFromBuf: Sized { + fn from_buf(buf: &[u8]) -> anyhow::Result<Self>; +} + +impl ValueFromBuf for u64 { + fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { + if buf.len() != 8 { + bail!("u64 is not 64 bits long") + } + Ok((buf[0] as u64) << 24 + | (buf[1] as u64) << 16 + | (buf[2] as u64) << 8 + | (buf[3] as u64) << 0) + } +} +impl ValueFromBuf for Vec<u8> { + fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { + Ok(buf.to_vec()) + } +} +impl ValueFromBuf for String { + fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { + Ok(String::from_utf8(Vec::from(buf))?) + } +} +impl ValueFromBuf for Master { + fn from_buf(_buf: &[u8]) -> anyhow::Result<Self> { + Ok(Master::Start) + } +} |