Alternative Inode serializer (as a Base32 str)

pmeunier
Sep 21, 2021, 7:13 PM
EEFI7RAXQQ4IMVWLW5PPNKKLO5WQQZPLXJKARNICTXZIM3XYJOFQC

Dependencies

  • [2] YGPEHOTE libpijul::fs::add_{file,dir} now return the created Inode
  • [3] 2RXOCWUW Making libpijul deterministic (and getting rid of `rand`)
  • [4] YN63NUZO Sanakirja 1.0
  • [5] RRCSHAYZ Formatting
  • [6] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).

Change contents

  • replacement in "libpijul/src/pristine/inode.rs" at line 5
    [2.243][3.3392:3436](),[3.643870][3.3392:3436]()
    pub struct Inode(pub(in crate) super::L64);
    [2.243]
    [3.2648]
    pub struct Inode(pub super::L64);
  • replacement in "libpijul/src/pristine/inode.rs" at line 12
    [3.644100][3.3476:3557]()
    BigEndian::write_u64(&mut b, (self.0).0); // self.0.to_slice_le(&mut b);
    [3.644100]
    [3.644149]
    BigEndian::write_u64(&mut b, (self.0).0);
  • edit in "libpijul/src/pristine/inode.rs" at line 42
    [2.609]
    pub mod inode_base32_serde {
    use serde::*;
    use super::*;
    pub struct InodeDe{}
    impl<'de> serde::de::Visitor<'de> for InodeDe {
    type Value = Inode;
    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
    write!(formatter, "a base32-encoded string")
    }
    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
    where
    E: de::Error,
    {
    let mut b = [0; 8];
    if data_encoding::BASE32_NOPAD.decode_mut(s.as_bytes(), &mut b).is_ok() {
    let b: u64 = BigEndian::read_u64(&b);
    Ok(Inode(b.into()))
    } else {
    Err(de::Error::invalid_value(serde::de::Unexpected::Str(s), &self))
    }
    }
    }
    pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Inode, D::Error> {
    d.deserialize_str(InodeDe{})
    }
    pub fn serialize<S: Serializer>(inode: &Inode, s: S) -> Result<S::Ok, S::Error> {
    let inode: u64 = inode.0.into();
    let mut b = [0; 8];
    BigEndian::write_u64(&mut b, inode);
    let mut bb = [0; 13];
    data_encoding::BASE32_NOPAD.encode_mut(&b, &mut bb);
    let b = std::str::from_utf8(&bb).unwrap();
    s.serialize_str(b)
    }
    }