use reqwest::{header::CONTENT_TYPE, RequestBuilder};
use serde::Serialize;
#[derive(Debug)]
pub struct AudioSource(InternalAudioSource);
#[derive(Debug)]
enum InternalAudioSource {
Url(String),
Buffer {
buffer: reqwest::Body,
mime_type: Option<String>,
},
}
impl AudioSource {
pub fn from_url(url: impl Into<String>) -> Self {
Self(InternalAudioSource::Url(url.into()))
}
pub fn from_buffer(buffer: impl Into<reqwest::Body>) -> Self {
Self(InternalAudioSource::Buffer {
buffer: buffer.into(),
mime_type: None,
})
}
pub fn from_buffer_with_mime_type(
buffer: impl Into<reqwest::Body>,
mime_type: impl Into<String>,
) -> Self {
Self(InternalAudioSource::Buffer {
buffer: buffer.into(),
mime_type: Some(mime_type.into()),
})
}
#[allow(missing_docs)]
pub fn fill_body(self, request_builder: RequestBuilder) -> RequestBuilder {
match self.0 {
InternalAudioSource::Url(url) => {
#[derive(Serialize)]
struct UrlSource {
url: String,
}
request_builder.json(&UrlSource { url })
}
InternalAudioSource::Buffer { buffer, mime_type } => {
let request_builder = request_builder.body(buffer);
if let Some(mime_type) = mime_type {
request_builder.header(CONTENT_TYPE, mime_type)
} else {
request_builder
}
}
}
}
}