ps-datachunk 0.1.0-37

Chunk-based data encrypter
Documentation
use std::sync::Arc;

use bytes::Bytes;

use crate::{DataChunkError, OwnedDataChunk, Result};

impl From<OwnedDataChunk> for Bytes {
    fn from(value: OwnedDataChunk) -> Self {
        value.data
    }
}

impl From<&OwnedDataChunk> for Bytes {
    fn from(value: &OwnedDataChunk) -> Self {
        value.bytes()
    }
}

impl TryFrom<Arc<[u8]>> for OwnedDataChunk {
    type Error = DataChunkError;

    fn try_from(value: Arc<[u8]>) -> Result<Self> {
        let hash = ps_hash::hash(&value)?;

        Ok(Self::from_data_and_hash_unchecked(value, hash))
    }
}

impl TryFrom<&Arc<[u8]>> for OwnedDataChunk {
    type Error = DataChunkError;

    fn try_from(value: &Arc<[u8]>) -> Result<Self> {
        let hash = ps_hash::hash(value)?;

        Ok(Self::from_data_and_hash_unchecked(value.clone(), hash))
    }
}

#[cfg(test)]
mod tests {
    use std::sync::Arc;

    use bytes::Bytes;

    use crate::{OwnedDataChunk, Result};

    #[test]
    fn test_owned_datachunk_to_bytes_from_ref() -> Result<()> {
        let original_data = vec![1, 2, 3, 4, 5];
        let data_chunk = OwnedDataChunk::from_data(original_data.clone())?;

        let bytes = Bytes::from(&data_chunk);

        assert_eq!(bytes.as_ref(), original_data);

        Ok(())
    }

    #[test]
    fn test_owned_datachunk_try_from_arc() -> Result<()> {
        let original_data: Arc<[u8]> = Arc::from(vec![9, 8, 7, 6]);
        let data_chunk = OwnedDataChunk::try_from(original_data.clone())?;

        assert_eq!(data_chunk.data_ref(), original_data.as_ref());
        assert_eq!(data_chunk.hash(), ps_hash::hash(&original_data)?);

        Ok(())
    }

    #[test]
    fn test_owned_datachunk_try_from_arc_ref() -> Result<()> {
        let original_data: Arc<[u8]> = Arc::from(vec![9, 8, 7, 6]);
        let data_chunk = OwnedDataChunk::try_from(&original_data)?;

        assert_eq!(data_chunk.data_ref(), original_data.as_ref());
        assert_eq!(data_chunk.hash(), ps_hash::hash(&original_data)?);

        Ok(())
    }
}