use super::NamedLeaf;
use crate::pb::UnixFs;
use ipld_core::cid::Cid;
use quick_protobuf::{MessageWrite, Writer, WriterBackend};
pub(super) struct CustomFlatUnixFs<'a> {
pub(super) links: &'a [Option<NamedLeaf>],
pub(super) data: UnixFs<'a>,
}
impl CustomFlatUnixFs<'_> {
fn mapped(&self) -> impl Iterator<Item = NamedLeafAsPBLink<'_>> + '_ {
self.links
.iter()
.map(|triple| triple.as_ref().map(NamedLeafAsPBLink).unwrap())
}
}
impl MessageWrite for CustomFlatUnixFs<'_> {
fn get_size(&self) -> usize {
use quick_protobuf::sizeofs::*;
let links = self
.mapped()
.map(|link| 1 + sizeof_len(link.get_size()))
.sum::<usize>();
links + 1 + sizeof_len(self.data.get_size())
}
fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> quick_protobuf::Result<()> {
self.mapped()
.try_for_each(|l| w.write_with_tag(18, |w| w.write_message(&l)))?;
w.write_with_tag(10, |w| w.write_message(&self.data))
}
}
struct NamedLeafAsPBLink<'a>(&'a NamedLeaf);
impl MessageWrite for NamedLeafAsPBLink<'_> {
fn get_size(&self) -> usize {
use quick_protobuf::sizeofs::*;
1 + sizeof_len((self.0).0.len())
+ 1
+ sizeof_len(WriteableCid(&(self.0).1).get_size())
+ 1
+ sizeof_varint((self.0).2)
}
fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> quick_protobuf::Result<()> {
w.write_with_tag(10, |w| w.write_message(&WriteableCid(&(self.0).1)))?;
w.write_with_tag(18, |w| w.write_string((self.0).0.as_str()))?;
w.write_with_tag(24, |w| w.write_uint64((self.0).2))?;
Ok(())
}
}
struct WriteableCid<'a>(&'a Cid);
impl MessageWrite for WriteableCid<'_> {
fn get_size(&self) -> usize {
use ipld_core::cid::Version::*;
use quick_protobuf::sizeofs::*;
let hash_len = self.0.hash().to_bytes().len();
match self.0.version() {
V0 => hash_len,
V1 => {
let version_len = 1;
let codec_len = sizeof_varint(self.0.codec());
version_len + codec_len + hash_len
}
}
}
fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> quick_protobuf::Result<()> {
use ipld_core::cid::Version::*;
match self.0.version() {
V0 => { }
V1 => {
w.write_u8(1)?;
w.write_varint(self.0.codec())?;
}
}
self.0
.hash()
.to_bytes()
.iter()
.try_for_each(|b| w.write_u8(*b))
}
}