stigmerge_peer 0.6.2

stigmerge p2p protocol and agent components
mod header;
mod index;
mod peerinfo;
mod request;

#[allow(dead_code)]
#[rustfmt::skip]
mod stigmerge_capnp;

use std::{array::TryFromSliceError, num::TryFromIntError, path::PathBuf, str::Utf8Error};

use veilid_core::ValueData;

pub use header::{HaveMapRef, Header, PeerMapRef};
pub use peerinfo::PeerInfo;
pub use request::{AdvertisePeerRequest, BlockRequest, Request};

const MAX_RECORD_DATA_SIZE: usize = 1_048_576;
const MAX_INDEX_BYTES: usize = MAX_RECORD_DATA_SIZE - ValueData::MAX_LEN;

#[derive(thiserror::Error, Debug)]
pub enum Error {
    #[error("{0}")]
    Capnp(#[from] capnp::Error),
    #[error("{0}")]
    NotInSchema(#[from] capnp::NotInSchema),
    #[error("{0}")]
    InternalDigestSlice(#[from] TryFromSliceError),
    #[error("index too large: {0} bytes")]
    IndexTooLarge(usize),
    #[error("{0}")]
    EncodePath(PathBuf),
    #[error("{0}")]
    DecodePath(#[from] Utf8Error),
    #[error("{0}")]
    InternalUsize(#[from] TryFromIntError),
    #[error("{0}")]
    Other(String),
}

pub type Result<T> = std::result::Result<T, Error>;

pub trait Encoder {
    fn encode(&self) -> Result<Vec<u8>>;
}

pub trait Decoder: Sized {
    fn decode(buf: &[u8]) -> Result<Self>;
}

pub type Digest = [u8; 32];
pub type PublicKey = [u8; 32];