seq_marked/seq_marked/
impl_try_from_meta_bytes.rs1use 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}