openai-interface 0.13.0

A low-level Rust interface for the OpenAI API
Documentation
//! Returns the contents of the specified file.
//!
//! > ![warn] This module is untested!
//! > OpenAI-compatible providers (DeepSeek, Qwen) are not known to implement
//! > this endpoint, and no OpenAI API key was available for testing. If you
//! > encounter any issues, please report them on the repository.

pub mod request {
    use std::collections::HashMap;

    use url::Url;

    use crate::{
        errors::OapiError,
        rest::get::{Get, GetBinary},
    };

    /// Returns the contents of the specified file as raw bytes.
    #[derive(Debug, Default)]
    pub struct ContentRequest<'a> {
        /// The ID of the file to use for this request.
        pub file_id: &'a str,
        /// Add additional query parameters to the request.
        pub extra_query: HashMap<&'a str, &'a str>,
    }

    impl Get for ContentRequest<'_> {
        /// base_url should look like <https://api.openai.com/v1>
        fn build_url(&self, base_url: &str) -> Result<String, OapiError> {
            let mut url =
                Url::parse(base_url.trim_end_matches('/')).map_err(OapiError::UrlError)?;
            url.path_segments_mut()
                .map_err(|_| OapiError::UrlCannotBeBase(base_url.to_string()))?
                .push("files")
                .push(self.file_id)
                .push("content");

            for (key, value) in &self.extra_query {
                url.query_pairs_mut().append_pair(key, value);
            }

            Ok(url.to_string())
        }
    }

    impl GetBinary for ContentRequest<'_> {}
}

#[cfg(test)]
mod tests {
    use super::request::ContentRequest;
    use crate::rest::get::Get;

    #[test]
    fn test_build_url() {
        let request = ContentRequest {
            file_id: "file-abc123",
            ..Default::default()
        };
        let url = request.build_url("https://api.openai.com/v1/").unwrap();
        assert_eq!(url, "https://api.openai.com/v1/files/file-abc123/content");
    }
}