cs_string_rw/
read_cs_string.rs

1use crate::read_7_bit_encoded_i32::Read7BitEncodedI32Ext;
2use std::io;
3
4pub trait ReadCsStrExt {
5	fn read_cs_string(&mut self) -> io::Result<String>;
6}
7
8impl<T: io::Read> ReadCsStrExt for T {
9	fn read_cs_string(&mut self) -> io::Result<String> {
10		let size = self.read_7_bit_encoded_i32()?;
11		let mut buf = vec![0u8; size as usize];
12		self.read_exact(&mut buf)?;
13		match String::from_utf8(buf) {
14			Ok(v) => Ok(v),
15			Err(e) => Err(io::Error::new(io::ErrorKind::Other, e)),
16		}
17	}
18}
19
20#[cfg(test)]
21mod tests {
22	use super::*;
23	use crate::read_byte_arr::ReadByteArr;
24
25	#[test]
26	fn reading_cs_strings() {
27		let arr: [u8; 580] = [
28			0x00, 0x01, 0x61, 0x80, 0x02, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
29			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
30			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
31			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
32			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
33			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
34			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
35			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
36			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
37			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
38			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
39			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
40			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
41			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
42			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
43			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
44			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
45			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
46			0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x04, 0xf0, 0x9f, 0x93, 0xae,
47			0xb8, 0x02, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8,
48			0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f,
49			0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0,
50			0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f,
51			0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f,
52			0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4,
53			0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2,
54			0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80,
55			0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d,
56			0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2,
57			0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98,
58			0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0,
59			0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef,
60			0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8,
61			0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f,
62			0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0,
63			0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f,
64			0x8f, 0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f,
65			0xb4, 0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4,
66			0xe2, 0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2,
67			0x80, 0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80,
68			0x8d, 0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f, 0xf0, 0x9f, 0x8f, 0xb4, 0xe2, 0x80, 0x8d,
69			0xe2, 0x98, 0xa0, 0xef, 0xb8, 0x8f,
70		];
71		let mut reader = ReadByteArr::new(&arr);
72		assert_eq!(reader.read_cs_string().unwrap(), "");
73		assert_eq!(reader.read_cs_string().unwrap(), "a");
74		assert_eq!(reader.read_cs_string().unwrap(), "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
75		assert_eq!(reader.read_cs_string().unwrap(), "📮");
76		assert_eq!(
77			reader.read_cs_string().unwrap(),
78			"🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️🏴‍☠️"
79		);
80	}
81
82	#[test]
83	fn invalid_string_size() {
84		let arr: [u8; 2] = [0x7F, 0x41];
85		let mut reader = ReadByteArr::new(&arr);
86		assert_eq!(
87			reader.read_cs_string().map_err(|e| e.kind()),
88			Err(io::ErrorKind::UnexpectedEof)
89		);
90	}
91
92	#[test]
93	fn invalid_string() {
94		let arr: [u8; 2] = [0x1, 0x80];
95		let mut reader = ReadByteArr::new(&arr);
96		assert_eq!(
97			reader.read_cs_string().map_err(|e| e.kind()),
98			Err(io::ErrorKind::Other)
99		);
100	}
101}