Skip to main content

ps_datachunk/owned/implementations/
from.rs

1use std::sync::Arc;
2
3use bytes::Bytes;
4
5use crate::{DataChunkError, OwnedDataChunk, Result};
6
7impl From<OwnedDataChunk> for Bytes {
8    fn from(value: OwnedDataChunk) -> Self {
9        value.data
10    }
11}
12
13impl From<&OwnedDataChunk> for Bytes {
14    fn from(value: &OwnedDataChunk) -> Self {
15        value.bytes()
16    }
17}
18
19impl TryFrom<Arc<[u8]>> for OwnedDataChunk {
20    type Error = DataChunkError;
21
22    fn try_from(value: Arc<[u8]>) -> Result<Self> {
23        let hash = ps_hash::hash(&value)?;
24
25        Ok(Self::from_data_and_hash_unchecked(value, hash))
26    }
27}
28
29impl TryFrom<&Arc<[u8]>> for OwnedDataChunk {
30    type Error = DataChunkError;
31
32    fn try_from(value: &Arc<[u8]>) -> Result<Self> {
33        let hash = ps_hash::hash(value)?;
34
35        Ok(Self::from_data_and_hash_unchecked(value.clone(), hash))
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use std::sync::Arc;
42
43    use bytes::Bytes;
44
45    use crate::{OwnedDataChunk, Result};
46
47    #[test]
48    fn test_owned_datachunk_to_bytes_from_ref() -> Result<()> {
49        let original_data = vec![1, 2, 3, 4, 5];
50        let data_chunk = OwnedDataChunk::from_data(original_data.clone())?;
51
52        let bytes = Bytes::from(&data_chunk);
53
54        assert_eq!(bytes.as_ref(), original_data);
55
56        Ok(())
57    }
58
59    #[test]
60    fn test_owned_datachunk_try_from_arc() -> Result<()> {
61        let original_data: Arc<[u8]> = Arc::from(vec![9, 8, 7, 6]);
62        let data_chunk = OwnedDataChunk::try_from(original_data.clone())?;
63
64        assert_eq!(data_chunk.data_ref(), original_data.as_ref());
65        assert_eq!(data_chunk.hash(), ps_hash::hash(&original_data)?);
66
67        Ok(())
68    }
69
70    #[test]
71    fn test_owned_datachunk_try_from_arc_ref() -> Result<()> {
72        let original_data: Arc<[u8]> = Arc::from(vec![9, 8, 7, 6]);
73        let data_chunk = OwnedDataChunk::try_from(&original_data)?;
74
75        assert_eq!(data_chunk.data_ref(), original_data.as_ref());
76        assert_eq!(data_chunk.hash(), ps_hash::hash(&original_data)?);
77
78        Ok(())
79    }
80}