diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-14 11:36:57 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-14 11:36:57 +0100 |
commit | 6c023ddeaa0894813fc74038af7568c2d867c052 (patch) | |
tree | 3d323c62fa8a6c2a7827d15061843fce8a7418f0 /ebml/src/lib.rs | |
parent | 855a8896175ee45a3376775203fa20e629d809b3 (diff) | |
download | jellything-6c023ddeaa0894813fc74038af7568c2d867c052.tar jellything-6c023ddeaa0894813fc74038af7568c2d867c052.tar.bz2 jellything-6c023ddeaa0894813fc74038af7568c2d867c052.tar.zst |
parsing should work
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!(), + }) + } +} |