use std::collections::HashMap;
use scuffle_amf0::{Amf0Object, Amf0Value};
use scuffle_bytes_util::StringCow;
use serde_derive::{Deserialize, Serialize};
use super::on_status::{OnStatus, OnStatusCode};
use crate::command_messages::CommandResultLevel;
pub mod reader;
pub mod writer;
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(bound = "'a: 'de")]
pub struct NetConnectionCommandConnect<'a> {
pub app: StringCow<'a>,
#[serde(default)]
pub caps_ex: Option<CapsExMask>,
#[serde(flatten, borrow)]
pub others: HashMap<StringCow<'a>, Amf0Value<'a>>,
}
#[derive(Deserialize)]
#[serde(from = "u8", into = "u8")]
#[bitmask_enum::bitmask(u8)]
pub enum CapsExMask {
Reconnect = 0x01,
Multitrack = 0x02,
ModEx = 0x04,
TimestampNanoOffset = 0x08,
}
#[derive(Debug, Clone, PartialEq)]
pub struct NetConnectionCommandConnectResult<'a> {
pub properties: NetConnectionCommandConnectResultProperties<'a>,
pub information: OnStatus<'a>,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct NetConnectionCommandConnectResultProperties<'a> {
pub fms_ver: StringCow<'a>,
pub capabilities: f64,
}
impl Default for NetConnectionCommandConnectResultProperties<'static> {
fn default() -> Self {
Self {
fms_ver: "FMS/3,0,1,123".into(),
capabilities: 31.0,
}
}
}
impl Default for NetConnectionCommandConnectResult<'_> {
fn default() -> Self {
Self {
information: OnStatus {
level: CommandResultLevel::Status,
code: OnStatusCode::NET_CONNECTION_CONNECT_SUCCESS,
description: Some("Connection Succeeded.".into()),
others: Some([("objectEncoding".into(), Amf0Value::Number(0.0))].into_iter().collect()),
},
properties: Default::default(),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum NetConnectionCommand<'a> {
Connect(NetConnectionCommandConnect<'a>),
ConnectResult(NetConnectionCommandConnectResult<'a>),
Call {
command_object: Option<Amf0Object<'a>>,
optional_arguments: Option<Amf0Object<'a>>,
},
Close,
CreateStream,
CreateStreamResult {
stream_id: f64,
},
}