sheave_core/messages/
fc_subscribe.rs1use std::io::Result as IOResult;
2use super::{
3 Channel,
4 ChunkData,
5 Command,
6 headers::MessageType
7};
8use crate::{
9 Decoder,
10 Encoder,
11 ByteBuffer,
12 messages::amf::v0::{
13 AmfString,
14 Null
15 }
16};
17
18#[derive(Debug, Clone, PartialEq)]
20pub struct FcSubscribe(AmfString);
21
22impl FcSubscribe {
23 pub fn new(topic_path: AmfString) -> Self {
25 Self(topic_path)
26 }
27
28 pub fn get_topic_path(&self) -> &AmfString {
30 &self.0
31 }
32}
33
34impl From<FcSubscribe> for AmfString {
35 fn from(fc_subscribe: FcSubscribe) -> Self {
36 fc_subscribe.0
37 }
38}
39
40impl ChunkData for FcSubscribe {
41 const CHANNEL: Channel = Channel::System;
42 const MESSAGE_TYPE: MessageType = MessageType::Command;
43}
44
45impl Command for FcSubscribe {}
46
47impl Decoder<FcSubscribe> for ByteBuffer {
48 fn decode(&mut self) -> IOResult<FcSubscribe> {
93 Decoder::<Null>::decode(self)?;
94 let topic_path: AmfString = self.decode()?;
95 Ok(FcSubscribe(topic_path))
96 }
97}
98
99impl Encoder<FcSubscribe> for ByteBuffer {
100 fn encode(&mut self, fc_subscribe: &FcSubscribe) {
102 self.encode(&Null);
103 self.encode(fc_subscribe.get_topic_path());
104 }
105}
106
107#[cfg(test)]
108mod tests {
109 use super::*;
110
111 #[test]
112 fn decode_fc_subscribe() {
113 let mut buffer = ByteBuffer::default();
114 buffer.encode(&Null);
115 buffer.encode(&AmfString::default());
116 let result: IOResult<FcSubscribe> = buffer.decode();
117 assert!(result.is_ok());
118 let actual = result.unwrap();
119 let expected = FcSubscribe::new(AmfString::default());
120 assert_eq!(expected, actual)
121 }
122
123 #[test]
124 fn encode_fc_subscribe() {
125 let mut buffer = ByteBuffer::default();
126 let expected_topic_path = "";
127 let expected = FcSubscribe::new(AmfString::from(expected_topic_path));
128 buffer.encode(&expected);
129 Decoder::<Null>::decode(&mut buffer).unwrap();
130 let actual_topic_path: AmfString = buffer.decode().unwrap();
131 assert_eq!(expected_topic_path, actual_topic_path)
132 }
133}