async-openai 0.34.0

Rust library for OpenAI
Documentation
use crate::error::OpenAIError;
use crate::types::InputSource;
use reqwest::Body;

#[cfg(not(target_family = "wasm"))]
pub(crate) async fn file_stream_body(source: InputSource) -> Result<Body, OpenAIError> {
    let body = match source {
        InputSource::Path { path } => {
            let file = tokio::fs::File::open(path)
                .await
                .map_err(|e| OpenAIError::FileReadError(e.to_string()))?;
            let stream =
                tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new());
            Body::wrap_stream(stream)
        }
        _ => {
            return Err(OpenAIError::FileReadError(
                "Cannot create stream from non-file source".to_string(),
            ))
        }
    };
    Ok(body)
}

/// Creates the part for the given file for multipart upload.
pub(crate) async fn create_file_part(
    source: InputSource,
) -> Result<reqwest::multipart::Part, OpenAIError> {
    let (stream, file_name) = match source {
        #[cfg(not(target_family = "wasm"))]
        InputSource::Path { path } => {
            let file_name = path
                .file_name()
                .ok_or_else(|| {
                    OpenAIError::FileReadError(format!(
                        "cannot extract file name from {}",
                        path.display()
                    ))
                })?
                .to_str()
                .unwrap()
                .to_string();

            (
                file_stream_body(InputSource::Path { path }).await?,
                file_name,
            )
        }
        InputSource::Bytes { filename, bytes } => (Body::from(bytes), filename),
        InputSource::VecU8 { filename, vec } => (Body::from(vec), filename),
    };

    let file_part = reqwest::multipart::Part::stream(stream).file_name(file_name);

    Ok(file_part)
}

#[cfg(all(any(feature = "image", feature = "audio"), not(target_family = "wasm")))]
pub(crate) fn create_all_dir<P: AsRef<std::path::Path>>(dir: P) -> Result<(), OpenAIError> {
    let exists = match std::path::Path::try_exists(dir.as_ref()) {
        Ok(exists) => exists,
        Err(e) => return Err(OpenAIError::FileSaveError(e.to_string())),
    };

    if !exists {
        std::fs::create_dir_all(dir.as_ref())
            .map_err(|e| OpenAIError::FileSaveError(e.to_string()))?;
    }

    Ok(())
}