1use std::io;
2
3use bytes::Bytes;
4use scuffle_amf0::{Amf0Decoder, Amf0Marker, Amf0Value};
5use scuffle_bytes_util::BytesCursorExt;
6
7#[derive(Debug, Clone, PartialEq)]
8pub struct ScriptData {
9 pub name: String,
11 pub data: Vec<Amf0Value<'static>>,
13}
14
15impl ScriptData {
16 pub fn demux(reader: &mut io::Cursor<Bytes>) -> io::Result<Self> {
17 let buf = reader.extract_remaining();
18 let mut amf0_reader = Amf0Decoder::new(&buf);
19
20 let name = match amf0_reader.decode_with_type(Amf0Marker::String) {
21 Ok(Amf0Value::String(name)) => name,
22 _ => return Err(io::Error::new(io::ErrorKind::InvalidData, "Invalid script data name")),
23 };
24
25 let data = amf0_reader
26 .decode_all()
27 .map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid script data"))?;
28
29 Ok(Self {
30 name: name.into_owned(),
31 data: data.into_iter().map(|v| v.to_owned()).collect(),
32 })
33 }
34}
35
36#[cfg(test)]
37#[cfg_attr(all(test, coverage_nightly), coverage(off))]
38mod tests {
39 use super::*;
40
41 #[test]
42 fn test_script_data() {
43 let mut reader = io::Cursor::new(Bytes::from_static(&[
44 0x02, 0x00, 0x0A, b'o', b'n', b'M', b'e', b't', b'a', b'D', b'a', b't', b'a', 0x05, 0x05, ]));
50 let script_data = ScriptData::demux(&mut reader).unwrap();
51 assert_eq!(script_data.name, "onMetaData");
52 assert_eq!(script_data.data.len(), 2);
53 assert_eq!(script_data.data[0], Amf0Value::Null);
54 assert_eq!(script_data.data[1], Amf0Value::Null);
55 }
56}