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.rs75
1 files changed, 8 insertions, 67 deletions
diff --git a/ebml/src/lib.rs b/ebml/src/lib.rs
index 22af473..a03ce0d 100644
--- a/ebml/src/lib.rs
+++ b/ebml/src/lib.rs
@@ -1,77 +1,18 @@
-use anyhow::bail;
-
pub mod matroska;
pub mod read;
pub mod write;
+pub mod size;
+
+use size::EbmlSize;
+
+pub use read::ReadValue;
+pub use write::WriteValue;
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Master {
- Start,
+ Start(EbmlSize),
End,
}
-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 too big")
- }
- let mut val = 0u64;
- for byte in buf {
- val <<= 8;
- val |= *byte as 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())
- }
-}
-impl ValueFromBuf for String {
- fn from_buf(buf: &[u8]) -> anyhow::Result<Self> {
- 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!(),
- })
- }
-}