use std::collections::{BTreeMap, btree_map};
use serde::{Deserialize, Serialize};
use crate::catalog::millis::MillisCeil;
use crate::catalog::{Compression, Mode};
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct Binary {
pub tracks: BTreeMap<String, BinaryConfig>,
}
impl crate::catalog::Section for Binary {
const MAP: &'static str = "tracks";
}
impl Binary {
pub fn insert(&mut self, name: &str, config: BinaryConfig) -> crate::Result<()> {
let btree_map::Entry::Vacant(entry) = self.tracks.entry(name.to_string()) else {
return Err(crate::Error::Duplicate(name.to_string()));
};
entry.insert(config);
Ok(())
}
pub fn remove(&mut self, name: &str) -> Option<BinaryConfig> {
self.tracks.remove(name)
}
pub fn is_empty(&self) -> bool {
self.tracks.is_empty()
}
}
#[serde_with::serde_as]
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct BinaryConfig {
#[serde(default)]
pub broadcast: Option<moq_net::path::RelativeOwned>,
#[serde_as(as = "serde_with::DisplayFromStr")]
pub mode: Mode,
#[serde(default)]
#[serde_as(as = "Option<serde_with::DisplayFromStr>")]
pub compression: Option<Compression>,
#[serde(default)]
pub mime: Option<String>,
#[serde(default)]
pub bitrate: Option<u64>,
#[serde_as(as = "MillisCeil")]
#[serde(default)]
pub jitter: Option<std::time::Duration>,
#[serde_as(as = "MillisCeil")]
#[serde(default)]
pub delay: Option<std::time::Duration>,
#[serde(flatten)]
pub extra: serde_json::Map<String, serde_json::Value>,
}
impl BinaryConfig {
pub fn new(mode: Mode) -> Self {
Self {
broadcast: None,
mode,
compression: None,
mime: None,
bitrate: None,
jitter: None,
delay: None,
extra: Default::default(),
}
}
}
impl AsMut<BinaryConfig> for BinaryConfig {
fn as_mut(&mut self) -> &mut Self {
self
}
}