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<u8>) -> 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<u8>) -> Result<(), crate::Error> {
        self.as_str().mls_encode(writer)
    }
}
impl MlsDecode for String {
    fn mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error> {
        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)
        );
    }
}