1 use crate::{MlsDecode, MlsEncode, MlsSize};
2 use alloc::{string::String, vec::Vec};
3 
4 impl MlsSize for str {
mls_encoded_len(&self) -> usize5     fn mls_encoded_len(&self) -> usize {
6         self.as_bytes().mls_encoded_len()
7     }
8 }
9 
10 impl MlsEncode for str {
mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error>11     fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
12         self.as_bytes().mls_encode(writer)
13     }
14 }
15 
16 impl MlsSize for String {
mls_encoded_len(&self) -> usize17     fn mls_encoded_len(&self) -> usize {
18         self.as_str().mls_encoded_len()
19     }
20 }
21 
22 impl MlsEncode for String {
mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error>23     fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
24         self.as_str().mls_encode(writer)
25     }
26 }
27 
28 impl MlsDecode for String {
mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error>29     fn mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error> {
30         String::from_utf8(Vec::mls_decode(reader)?).map_err(|_| crate::Error::Utf8)
31     }
32 }
33 
34 #[cfg(test)]
35 mod tests {
36     use crate::{Error, MlsDecode, MlsEncode};
37     use alloc::string::String;
38     use assert_matches::assert_matches;
39 
40     #[cfg(target_arch = "wasm32")]
41     use wasm_bindgen_test::wasm_bindgen_test as test;
42 
43     #[test]
serialization_works()44     fn serialization_works() {
45         assert_eq!(
46             vec![3, b'b', b'a', b'r'],
47             "bar".mls_encode_to_vec().unwrap()
48         );
49     }
50 
51     #[test]
data_round_trips()52     fn data_round_trips() {
53         let val = "foo";
54         let x = val.mls_encode_to_vec().unwrap();
55         assert_eq!(val, String::mls_decode(&mut &*x).unwrap());
56     }
57 
58     #[test]
empty_string_can_be_deserialized()59     fn empty_string_can_be_deserialized() {
60         assert_eq!(String::new(), String::mls_decode(&mut &[0u8][..]).unwrap());
61     }
62 
63     #[test]
too_short_string_to_deserialize_gives_an_error()64     fn too_short_string_to_deserialize_gives_an_error() {
65         assert_matches!(
66             String::mls_decode(&mut &[2, 3][..]),
67             Err(Error::UnexpectedEOF)
68         );
69     }
70 
71     #[test]
deserializing_invalid_utf8_fails()72     fn deserializing_invalid_utf8_fails() {
73         assert_matches!(
74             String::mls_decode(&mut &[0x02, 0xdf, 0xff][..]),
75             Err(Error::Utf8)
76         );
77     }
78 }
79