mls_rs_codec/
string.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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)
        );
    }
}