use super::ChunkAddress;
use crate::NetworkAddress;
use bytes::Bytes;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use xor_name::XorName;
const BROTLI_MAX_OVERHEAD_BYTES: usize = 16;
const PKCS7_MAX_PADDING_BYTES: usize = 16;
#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, custom_debug::Debug)]
pub struct Chunk {
pub address: ChunkAddress,
#[debug(skip)]
pub value: Bytes,
}
impl Chunk {
pub const MAX_RAW_SIZE: usize = 4 * 1024 * 1024;
pub const MAX_SIZE: usize =
Self::MAX_RAW_SIZE + BROTLI_MAX_OVERHEAD_BYTES + PKCS7_MAX_PADDING_BYTES;
pub fn new(value: Bytes) -> Self {
Self {
address: ChunkAddress::new(XorName::from_content(value.as_ref())),
value,
}
}
pub fn value(&self) -> &Bytes {
&self.value
}
pub fn address(&self) -> &ChunkAddress {
&self.address
}
pub fn network_address(&self) -> NetworkAddress {
NetworkAddress::ChunkAddress(self.address)
}
pub fn name(&self) -> &XorName {
self.address.xorname()
}
pub fn size(&self) -> usize {
self.value.len()
}
pub fn is_too_big(&self) -> bool {
self.size() > Self::MAX_SIZE
}
}
impl Serialize for Chunk {
fn serialize<S: Serializer>(&self, serialiser: S) -> Result<S::Ok, S::Error> {
self.value.serialize(serialiser)
}
}
impl<'de> Deserialize<'de> for Chunk {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = Deserialize::deserialize(deserializer)?;
Ok(Self::new(value))
}
}