ps_datachunk/owned/implementations/
from.rs1use 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}