aboutsummaryrefslogtreecommitdiff
path: root/ebml/src/write.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-01-13 17:12:47 +0100
committermetamuffin <metamuffin@disroot.org>2023-01-13 17:12:47 +0100
commitb192ec740d358d0e12eedd1308d006e080b3d8c2 (patch)
treef642ddaa0e35694f611cc97978f1031431b5fef2 /ebml/src/write.rs
parent7ca91b6f33bb260bc966e853c832b4339c1c2ae0 (diff)
downloadjellything-b192ec740d358d0e12eedd1308d006e080b3d8c2.tar
jellything-b192ec740d358d0e12eedd1308d006e080b3d8c2.tar.bz2
jellything-b192ec740d358d0e12eedd1308d006e080b3d8c2.tar.zst
new starting with a new ebml impl
Diffstat (limited to 'ebml/src/write.rs')
-rw-r--r--ebml/src/write.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/ebml/src/write.rs b/ebml/src/write.rs
new file mode 100644
index 0000000..b294d44
--- /dev/null
+++ b/ebml/src/write.rs
@@ -0,0 +1,36 @@
+use anyhow::{bail, Result};
+use std::io::Write;
+
+pub struct EbmlWriter<T> {
+ inner: T,
+ position: usize,
+}
+
+impl<T: Write> EbmlWriter<T> {
+ pub fn new(inner: T, position: usize) -> Self {
+ Self { inner, position }
+ }
+
+ pub fn write(&mut self, data: &[u8]) -> Result<()> {
+ self.inner.write_all(data)?;
+ self.position += data.len();
+ Ok(())
+ }
+
+ pub fn write_vint(&mut self, i: u64) -> Result<()> {
+ if i > (1 << 56) - 1 {
+ bail!("vint does not fit");
+ }
+ let mut len = 1;
+ while len <= 8 {
+ if i < (1 << ((7 * len) - 1)) {
+ break;
+ }
+ len += 1;
+ }
+ let mut bytes = i.to_be_bytes();
+ bytes[0] |= 1 << (8 - len);
+ self.write(&bytes)
+ }
+}
+