diff options
Diffstat (limited to 'ebml/src/lib.rs')
-rw-r--r-- | ebml/src/lib.rs | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/ebml/src/lib.rs b/ebml/src/lib.rs index 7445bbc..22af473 100644 --- a/ebml/src/lib.rs +++ b/ebml/src/lib.rs @@ -16,13 +16,6 @@ pub trait ValueFromBuf: Sized { 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) if buf.len() > 8 { bail!("u64 too big") } @@ -34,6 +27,34 @@ impl ValueFromBuf for u64 { Ok(val) } } +impl ValueFromBuf for i64 { + fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { + if buf.len() > 8 { + bail!("i64 too big") + } + Ok(if buf[0] > 127 { + if buf.len() == 8 { + i64::from_be_bytes(buf.try_into().unwrap()) + } else { + -((1 << (buf.len() * 8)) - (u64::from_buf(buf)? as i64)) + } + } else { + u64::from_buf(buf)? as i64 + }) + } +} +impl ValueFromBuf for f64 { + fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { + Ok(if buf.len() == 4 { + f32::from_be_bytes(buf.try_into().unwrap()) as f64 + } else if buf.len() == 8 { + f64::from_be_bytes(buf.try_into().unwrap()) + } else { + bail!("float is not 4 or 8 bytes long"); + }) + } +} + impl ValueFromBuf for Vec<u8> { fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { Ok(buf.to_vec()) @@ -44,3 +65,13 @@ impl ValueFromBuf for String { Ok(String::from_utf8(Vec::from(buf))?) } } +impl ValueFromBuf for Master { + /// this has an internal usage, where buf has len of 1, when an end should be constructed + fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { + Ok(match buf.len() { + 0 => Master::Start, + 1 => Master::End, + _ => unreachable!(), + }) + } +} |