use serde::{Deserialize, Serialize};
use crate::types::chat::BuildError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Mime {
#[serde(rename = "audio/wav")]
Wav,
#[serde(rename = "audio/webm")]
Webm,
#[serde(rename = "audio/mp4")]
Mp4,
#[serde(rename = "audio/m4a")]
M4a,
#[serde(rename = "audio/mpeg")]
Mpeg,
#[serde(rename = "audio/mp3")]
Mp3,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TranscriptionRequest {
pub base64: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime: Option<Mime>,
}
impl TranscriptionRequest {
pub fn builder() -> TranscriptionRequestBuilder {
TranscriptionRequestBuilder::default()
}
}
#[derive(Debug, Clone, Default)]
pub struct TranscriptionRequestBuilder {
base64: Option<String>,
mime: Option<Mime>,
}
impl TranscriptionRequestBuilder {
pub fn base64(mut self, base64: impl Into<String>) -> Self {
self.base64 = Some(base64.into());
self
}
pub fn mime(mut self, mime: Mime) -> Self {
self.mime = Some(mime);
self
}
pub fn build(self) -> Result<TranscriptionRequest, BuildError> {
let base64 = self.base64.ok_or(BuildError::MissingInput)?;
Ok(TranscriptionRequest {
base64,
mime: self.mime,
})
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TranscriptionResponse {
pub text: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Voice {
Alloy,
Ash,
Ballad,
Coral,
Echo,
Fable,
Nova,
Onyx,
Sage,
Shimmer,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpeechRequest {
pub input: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub voice: Option<Voice>,
}
impl SpeechRequest {
pub fn builder() -> SpeechRequestBuilder {
SpeechRequestBuilder::default()
}
}
#[derive(Debug, Clone, Default)]
pub struct SpeechRequestBuilder {
input: Option<String>,
voice: Option<Voice>,
}
impl SpeechRequestBuilder {
pub fn input(mut self, input: impl Into<String>) -> Self {
self.input = Some(input.into());
self
}
pub fn voice(mut self, voice: Voice) -> Self {
self.voice = Some(voice);
self
}
pub fn build(self) -> Result<SpeechRequest, BuildError> {
let input = self.input.ok_or(BuildError::MissingInput)?;
Ok(SpeechRequest {
input,
voice: self.voice,
})
}
}