Skip to main content

outfox_openai/spec/realtime/
form.rs

1#[cfg(feature = "realtime")]
2use crate::{error::OpenAIError, traits::AsyncTryFrom};
3
4#[cfg(feature = "realtime")]
5impl AsyncTryFrom<crate::spec::realtime::RealtimeCallCreateRequest> for reqwest::multipart::Form {
6    type Error = OpenAIError;
7
8    async fn try_from(
9        request: crate::spec::realtime::RealtimeCallCreateRequest,
10    ) -> Result<Self, Self::Error> {
11        use reqwest::multipart::Part;
12
13        // Create SDP part with content type application/sdp
14        let sdp_part = Part::text(request.sdp)
15            .mime_str("application/sdp")
16            .map_err(|e| OpenAIError::InvalidArgument(format!("Invalid content type: {}", e)))?;
17
18        let mut form = reqwest::multipart::Form::new().part("sdp", sdp_part);
19
20        // Add session as JSON if present
21        if let Some(session) = request.session {
22            let session_json = serde_json::to_string(&session).map_err(|e| {
23                OpenAIError::InvalidArgument(format!("Failed to serialize session: {}", e))
24            })?;
25            let session_part = Part::text(session_json)
26                .mime_str("application/json")
27                .map_err(|e| {
28                    OpenAIError::InvalidArgument(format!("Invalid content type: {}", e))
29                })?;
30            form = form.part("session", session_part);
31        }
32
33        Ok(form)
34    }
35}