aboutsummaryrefslogtreecommitdiff
path: root/ebml/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ebml/src/lib.rs')
-rw-r--r--ebml/src/lib.rs45
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!(),
+ })
+ }
+}