aboutsummaryrefslogtreecommitdiff
path: root/evc/src/format
diff options
context:
space:
mode:
Diffstat (limited to 'evc/src/format')
-rw-r--r--evc/src/format/ser.rs22
1 files changed, 22 insertions, 0 deletions
diff --git a/evc/src/format/ser.rs b/evc/src/format/ser.rs
index 817cafe..995ca75 100644
--- a/evc/src/format/ser.rs
+++ b/evc/src/format/ser.rs
@@ -103,6 +103,28 @@ impl<T: Ser> Ser for Vec<T> {
}
}
+pub trait ConstSizeSerExt: Sized {
+ fn write_const_size(&self, sink: &mut impl Write, size: usize) -> anyhow::Result<()>;
+ fn read_const_size(source: &mut impl Read, size: usize) -> anyhow::Result<Self>;
+}
+impl<T: Ser> ConstSizeSerExt for Vec<T> {
+ fn write_const_size(&self, sink: &mut impl Write, size: usize) -> anyhow::Result<()> {
+ assert_eq!(self.len(), size);
+ for e in self {
+ e.write(sink).context("some const-size vec")?;
+ }
+ Ok(())
+ }
+
+ fn read_const_size(source: &mut impl Read, size: usize) -> anyhow::Result<Self> {
+ let mut v = vec![];
+ for _ in 0..size {
+ v.push(T::read(source)?)
+ }
+ Ok(v)
+ }
+}
+
impl Ser for u8 {
fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> {
Ok(sink.write_all(&[*self]).context("write u8")?)