1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
// Copyright 2023 MaidSafe.net limited.
//
// This SAFE Network Software is licensed to you under The General Public License (GPL), version 3.
// Unless required by applicable law or agreed to in writing, the SAFE Network Software distributed
// under the GPL Licence is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. Please review the Licences for the specific language governing
// permissions and limitations relating to use of the SAFE Network Software.
use super::ChunkAddress;
use crate::NetworkAddress;
use bytes::Bytes;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use xor_name::XorName;
/// Chunk, an immutable chunk of data
#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, custom_debug::Debug)]
pub struct Chunk {
/// Network address. Omitted when serialising and
/// calculated from the `value` when deserialising.
pub address: ChunkAddress,
/// Contained data.
#[debug(skip)]
pub value: Bytes,
}
impl Chunk {
/// Creates a new instance of `Chunk`.
pub fn new(value: Bytes) -> Self {
Self {
address: ChunkAddress::new(XorName::from_content(value.as_ref())),
value,
}
}
/// Returns the value.
pub fn value(&self) -> &Bytes {
&self.value
}
/// Returns the address.
pub fn address(&self) -> &ChunkAddress {
&self.address
}
/// Returns the NetworkAddress
pub fn network_address(&self) -> NetworkAddress {
NetworkAddress::ChunkAddress(self.address)
}
/// Returns the name.
pub fn name(&self) -> &XorName {
self.address.xorname()
}
/// Returns size of contained value.
pub fn payload_size(&self) -> usize {
self.value.len()
}
/// Returns size of this chunk after serialisation.
pub fn serialised_size(&self) -> usize {
self.value.len()
}
}
impl Serialize for Chunk {
fn serialize<S: Serializer>(&self, serialiser: S) -> Result<S::Ok, S::Error> {
// Address is omitted since it's derived from value
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))
}
}