seq_marked/seq_marked/
impl_try_from_meta_bytes.rs

1use std::io;
2
3use crate::Marked;
4use crate::SeqMarked;
5
6impl<M> TryFrom<SeqMarked<(Option<M>, Vec<u8>)>> for SeqMarked<(Option<M>, String)> {
7    type Error = io::Error;
8
9    fn try_from(value: SeqMarked<(Option<M>, Vec<u8>)>) -> Result<Self, Self::Error> {
10        let (seq, marked) = value.into_parts();
11
12        let marked = Marked::<(Option<M>, String)>::try_from(marked)?;
13
14        Ok(SeqMarked::new(seq, marked))
15    }
16}
17
18impl<M> From<SeqMarked<(Option<M>, String)>> for SeqMarked<(Option<M>, Vec<u8>)> {
19    fn from(value: SeqMarked<(Option<M>, String)>) -> Self {
20        let (seq, marked) = value.into_parts();
21
22        let marked = Marked::<(Option<M>, Vec<u8>)>::from(marked);
23
24        SeqMarked::new(seq, marked)
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn test_try_from_bytes_to_string_success() {
34        let seq_marked = SeqMarked::new_normal(42, (Some("metadata"), "hello".as_bytes().to_vec()));
35        let result: Result<SeqMarked<(Option<&str>, String)>, _> = seq_marked.try_into();
36
37        assert!(result.is_ok());
38        let converted = result.unwrap();
39        assert_eq!(*converted.internal_seq(), 42);
40        assert_eq!(
41            converted.data_ref(),
42            Some(&(Some("metadata"), "hello".to_string()))
43        );
44    }
45
46    #[test]
47    fn test_try_from_bytes_to_string_without_meta() {
48        let seq_marked = SeqMarked::new_normal(10, (None::<String>, "world".as_bytes().to_vec()));
49        let result: Result<SeqMarked<(Option<String>, String)>, _> = seq_marked.try_into();
50
51        assert!(result.is_ok());
52        let converted = result.unwrap();
53        assert_eq!(*converted.internal_seq(), 10);
54        assert_eq!(converted.data_ref(), Some(&(None, "world".to_string())));
55    }
56
57    #[test]
58    fn test_try_from_bytes_to_string_tombstone() {
59        let seq_marked = SeqMarked::<(Option<String>, Vec<u8>)>::new_tombstone(5);
60        let result: Result<SeqMarked<(Option<String>, String)>, _> = seq_marked.try_into();
61
62        assert!(result.is_ok());
63        let converted = result.unwrap();
64        assert_eq!(*converted.internal_seq(), 5);
65        assert!(converted.is_tombstone());
66    }
67
68    #[test]
69    fn test_try_from_bytes_to_string_invalid_utf8() {
70        let invalid_bytes = vec![0xFF, 0xFE, 0xFD];
71        let seq_marked = SeqMarked::new_normal(20, (Some("test"), invalid_bytes));
72        let result: Result<SeqMarked<(Option<&str>, String)>, _> = seq_marked.try_into();
73
74        assert!(result.is_err());
75        let error = result.unwrap_err();
76        assert_eq!(error.kind(), io::ErrorKind::InvalidData);
77    }
78
79    #[test]
80    fn test_from_string_to_bytes() {
81        let seq_marked = SeqMarked::new_normal(30, (Some("metadata"), "hello".to_string()));
82        let converted: SeqMarked<(Option<&str>, Vec<u8>)> = seq_marked.into();
83
84        assert_eq!(*converted.internal_seq(), 30);
85        assert_eq!(
86            converted.data_ref(),
87            Some(&(Some("metadata"), "hello".as_bytes().to_vec()))
88        );
89    }
90
91    #[test]
92    fn test_from_string_to_bytes_without_meta() {
93        let seq_marked = SeqMarked::new_normal(15, (None::<String>, "world".to_string()));
94        let converted: SeqMarked<(Option<String>, Vec<u8>)> = seq_marked.into();
95
96        assert_eq!(*converted.internal_seq(), 15);
97        assert_eq!(
98            converted.data_ref(),
99            Some(&(None, "world".as_bytes().to_vec()))
100        );
101    }
102
103    #[test]
104    fn test_from_string_to_bytes_tombstone() {
105        let seq_marked = SeqMarked::<(Option<String>, String)>::new_tombstone(25);
106        let converted: SeqMarked<(Option<String>, Vec<u8>)> = seq_marked.into();
107
108        assert_eq!(*converted.internal_seq(), 25);
109        assert!(converted.is_tombstone());
110    }
111}