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