use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AudioToTextResponse {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_id: Option<String>,
pub model: String,
pub text: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpeechToTextEvent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub event_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub delta: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn nonstream_response_requires_id_model_and_text() {
for missing in ["id", "model", "text"] {
let mut value = serde_json::json!({
"id": "asr-1",
"model": "glm-asr-2512",
"text": "hello"
});
value.as_object_mut().unwrap().remove(missing);
assert!(serde_json::from_value::<AudioToTextResponse>(value).is_err());
}
}
#[test]
fn stream_event_preserves_open_event_type() {
let event: SpeechToTextEvent = serde_json::from_value(serde_json::json!({
"id": "asr-1",
"type": "transcript.text.future",
"delta": "hi"
}))
.unwrap();
assert_eq!(event.event_type.as_deref(), Some("transcript.text.future"));
assert_eq!(event.delta.as_deref(), Some("hi"));
}
}