use std::collections::HashMap;
use crate::common::types::{Bodies, Headers, QueryParams};
use derive_builder::Builder;
use serde::Serialize;
use super::types::{EncodingFormat, Input};
#[derive(Debug, Clone, Serialize, Builder)]
#[builder(
name = "RequestParamsBuilder",
derive(Debug),
pattern = "owned",
setter(strip_option)
)]
pub struct RequestParams {
pub model: String,
pub input: Input,
#[builder(default)]
pub encoding_format: EncodingFormat,
#[builder(default)]
pub dimensions: Option<usize>,
#[builder(default)]
pub user: Option<String>,
#[builder(default)]
#[serde(skip_serializing)]
pub extra_headers: Option<Headers>,
#[builder(default)]
#[serde(skip_serializing)]
pub extra_query: Option<QueryParams>,
#[builder(default)]
#[serde(skip_serializing)]
pub extra_body: Option<Bodies>,
#[builder(default)]
#[serde(skip_serializing)]
pub retry_count: Option<u32>,
#[builder(default)]
#[serde(skip_serializing)]
pub timeout_seconds: Option<u64>,
#[builder(default)]
#[serde(skip_serializing)]
pub user_agent: Option<String>,
}
pub fn embeddings_request<T>(model: &str, input: T) -> RequestParamsBuilder
where
T: Into<Input>,
{
let input = input.into();
RequestParamsBuilder::create_empty()
.model(model.to_string())
.input(input)
}
pub trait IntoRequestParams {
fn into_request_params(self) -> RequestParams;
}
impl IntoRequestParams for RequestParams {
fn into_request_params(self) -> RequestParams {
self
}
}
impl IntoRequestParams for RequestParamsBuilder {
fn into_request_params(self) -> RequestParams {
self.build().unwrap()
}
}
impl RequestParamsBuilder {
pub fn header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
let headers_map = self
.extra_headers
.get_or_insert_with(|| Some(HashMap::new()))
.get_or_insert_with(HashMap::new);
headers_map.insert(key.into(), value.into());
self
}
pub fn query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
let query_map = self
.extra_query
.get_or_insert_with(|| Some(HashMap::new()))
.get_or_insert_with(HashMap::new);
query_map.insert(key.into(), value.into());
self
}
pub fn body(mut self, key: impl Into<String>, value: impl Into<serde_json::Value>) -> Self {
let body_map = self
.extra_body
.get_or_insert_with(|| Some(HashMap::new()))
.get_or_insert_with(HashMap::new);
body_map.insert(key.into(), value.into());
self
}
}