1use std::borrow::Cow;
4
5use crate::coding::*;
6
7#[derive(Clone, Debug)]
9pub struct GoAway<'a> {
10 pub new_session_uri: Cow<'a, str>,
11}
12
13impl<'a> Message for GoAway<'a> {
14 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
15 self.new_session_uri.encode(w);
16 }
17
18 fn decode<R: bytes::Buf>(r: &mut R) -> Result<Self, DecodeError> {
19 let new_session_uri = Cow::<str>::decode(r)?;
20 Ok(Self { new_session_uri })
21 }
22}
23
24#[cfg(test)]
25mod tests {
26 use super::*;
27 use bytes::BytesMut;
28
29 fn encode_message<M: Message>(msg: &M) -> Vec<u8> {
30 let mut buf = BytesMut::new();
31 msg.encode(&mut buf);
32 buf.to_vec()
33 }
34
35 fn decode_message<M: Message>(bytes: &[u8]) -> Result<M, DecodeError> {
36 let mut buf = bytes::Bytes::from(bytes.to_vec());
37 M::decode(&mut buf)
38 }
39
40 #[test]
41 fn test_goaway_with_url() {
42 let msg = GoAway {
43 new_session_uri: "https://example.com/new".into(),
44 };
45
46 let encoded = encode_message(&msg);
47 let decoded: GoAway = decode_message(&encoded).unwrap();
48
49 assert_eq!(decoded.new_session_uri, "https://example.com/new");
50 }
51
52 #[test]
53 fn test_goaway_empty() {
54 let msg = GoAway {
55 new_session_uri: "".into(),
56 };
57
58 let encoded = encode_message(&msg);
59 let decoded: GoAway = decode_message(&encoded).unwrap();
60
61 assert_eq!(decoded.new_session_uri, "");
62 }
63}