moq_lite/ietf/
goaway.rs

1//! IETF moq-transport-07 goaway message
2
3use std::borrow::Cow;
4
5use crate::coding::*;
6
7/// GoAway message (0x10)
8#[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}