use serde::{ser::SerializeSeq, Deserialize, Serialize};
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
#[non_exhaustive]
pub enum Model {
#[allow(missing_docs)]
AuraAsteriaEn,
#[allow(missing_docs)]
AuraLunaEn,
#[allow(missing_docs)]
AuraStellaEn,
#[allow(missing_docs)]
AuraAthenaEn,
#[allow(missing_docs)]
AuraHeraEn,
#[allow(missing_docs)]
AuraOrionEn,
#[allow(missing_docs)]
AuraArcasEn,
#[allow(missing_docs)]
AuraPerseusEn,
#[allow(missing_docs)]
AuraAngusEn,
#[allow(missing_docs)]
AuraOrpheusEn,
#[allow(missing_docs)]
AuraHeliosEn,
#[allow(missing_docs)]
AuraZeusEn,
#[allow(missing_docs)]
CustomId(String),
}
impl AsRef<str> for Model {
fn as_ref(&self) -> &str {
match self {
Self::AuraAsteriaEn => "aura-asteria-en",
Self::AuraLunaEn => "aura-luna-en",
Self::AuraStellaEn => "aura-stella-en",
Self::AuraAthenaEn => "aura-athena-en",
Self::AuraHeraEn => "aura-hera-en",
Self::AuraOrionEn => "aura-orion-en",
Self::AuraArcasEn => "aura-arcas-en",
Self::AuraPerseusEn => "aura-perseus-en",
Self::AuraAngusEn => "aura-angus-en",
Self::AuraOrpheusEn => "aura-orpheus-en",
Self::AuraHeliosEn => "aura-helios-en",
Self::AuraZeusEn => "aura-zeus-en",
Self::CustomId(id) => id,
}
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum Encoding {
Linear16,
Mulaw,
Alaw,
Mp3,
Opus,
Flac,
Aac,
#[allow(missing_docs)]
CustomEncoding(String),
}
impl Encoding {
pub(crate) fn as_str(&self) -> &str {
match self {
Encoding::Linear16 => "linear16",
Encoding::Mulaw => "mulaw",
Encoding::Alaw => "alaw",
Encoding::Mp3 => "mp3",
Encoding::Opus => "opus",
Encoding::Flac => "flac",
Encoding::Aac => "aac",
Encoding::CustomEncoding(encoding) => encoding,
}
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum Container {
#[allow(missing_docs)]
Wav,
#[allow(missing_docs)]
Ogg,
#[allow(missing_docs)]
None,
#[allow(missing_docs)]
CustomContainer(String),
}
impl Container {
pub(crate) fn as_str(&self) -> &str {
match self {
Container::Wav => "wav",
Container::Ogg => "ogg",
Container::None => "none",
Container::CustomContainer(container) => container,
}
}
}
#[derive(Debug, PartialEq, Clone)]
pub struct Options {
model: Option<Model>,
encoding: Option<Encoding>,
sample_rate: Option<u32>,
container: Option<Container>,
bit_rate: Option<u32>,
}
#[derive(Debug, PartialEq, Clone)]
pub struct OptionsBuilder(Options);
#[derive(Debug, PartialEq, Clone)]
pub(super) struct SerializableOptions<'a>(pub(super) &'a Options);
impl Options {
pub fn builder() -> OptionsBuilder {
OptionsBuilder::new()
}
pub fn urlencoded(&self) -> Result<String, serde_urlencoded::ser::Error> {
serde_urlencoded::to_string(SerializableOptions(self))
}
}
impl OptionsBuilder {
pub fn new() -> Self {
Self(Options {
model: None,
encoding: None,
sample_rate: None,
container: None,
bit_rate: None,
})
}
pub fn model(mut self, model: Model) -> Self {
self.0.model = Some(model);
self
}
pub fn encoding(mut self, encoding: Encoding) -> Self {
self.0.encoding = Some(encoding);
self
}
pub fn sample_rate(mut self, sample_rate: u32) -> Self {
self.0.sample_rate = Some(sample_rate);
self
}
pub fn container(mut self, container: Container) -> Self {
self.0.container = Some(container);
self
}
pub fn bit_rate(mut self, bit_rate: u32) -> Self {
self.0.bit_rate = Some(bit_rate);
self
}
pub fn build(self) -> Options {
self.0
}
}
impl Default for OptionsBuilder {
fn default() -> Self {
Self::new()
}
}
impl Serialize for SerializableOptions<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut seq = serializer.serialize_seq(None)?;
let Options {
model,
encoding,
sample_rate,
container,
bit_rate,
} = self.0;
if let Some(model) = model {
seq.serialize_element(&("model", model.as_ref()))?;
}
if let Some(encoding) = encoding {
seq.serialize_element(&("encoding", encoding.as_str()))?;
}
if let Some(sample_rate) = sample_rate {
seq.serialize_element(&("sample_rate", sample_rate))?;
}
if let Some(container) = container {
seq.serialize_element(&("container", container.as_str()))?;
}
if let Some(bit_rate) = bit_rate {
seq.serialize_element(&("bit_rate", bit_rate))?;
}
seq.end()
}
}