use crate::{MlsDecode, MlsEncode, MlsSize}; use alloc::{string::String, vec::Vec}; impl MlsSize for str { fn mls_encoded_len(&self) -> usize { self.as_bytes().mls_encoded_len() } } impl MlsEncode for str { fn mls_encode(&self, writer: &mut Vec) -> Result<(), crate::Error> { self.as_bytes().mls_encode(writer) } } impl MlsSize for String { fn mls_encoded_len(&self) -> usize { self.as_str().mls_encoded_len() } } impl MlsEncode for String { fn mls_encode(&self, writer: &mut Vec) -> Result<(), crate::Error> { self.as_str().mls_encode(writer) } } impl MlsDecode for String { fn mls_decode(reader: &mut &[u8]) -> Result { String::from_utf8(Vec::mls_decode(reader)?).map_err(|_| crate::Error::Utf8) } } #[cfg(test)] mod tests { use crate::{Error, MlsDecode, MlsEncode}; use alloc::string::String; use assert_matches::assert_matches; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test as test; #[test] fn serialization_works() { assert_eq!( vec![3, b'b', b'a', b'r'], "bar".mls_encode_to_vec().unwrap() ); } #[test] fn data_round_trips() { let val = "foo"; let x = val.mls_encode_to_vec().unwrap(); assert_eq!(val, String::mls_decode(&mut &*x).unwrap()); } #[test] fn empty_string_can_be_deserialized() { assert_eq!(String::new(), String::mls_decode(&mut &[0u8][..]).unwrap()); } #[test] fn too_short_string_to_deserialize_gives_an_error() { assert_matches!( String::mls_decode(&mut &[2, 3][..]), Err(Error::UnexpectedEOF) ); } #[test] fn deserializing_invalid_utf8_fails() { assert_matches!( String::mls_decode(&mut &[0x02, 0xdf, 0xff][..]), Err(Error::Utf8) ); } }