use ferrin_spec::BoxFuture;
use ferrin_spec::Headers;
use ferrin_spec::ProviderOptions;
use ferrin_spec::embedding_model::EmbedOptions;
use ferrin_spec::error::ProviderError;
use super::default_settings::merge_provider_options;
use crate::middleware::EmbeddingMiddlewareContext;
use crate::middleware::EmbeddingModelMiddleware;
#[derive(Debug, Clone, Default)]
pub struct EmbeddingDefaults {
pub headers: Headers,
pub provider_options: ProviderOptions,
}
#[derive(Debug, Clone)]
pub struct DefaultEmbeddingSettings {
defaults: EmbeddingDefaults,
}
#[must_use]
pub fn default_embedding_settings(defaults: EmbeddingDefaults) -> DefaultEmbeddingSettings {
DefaultEmbeddingSettings { defaults }
}
impl DefaultEmbeddingSettings {
#[must_use]
pub fn apply(&self, mut options: EmbedOptions) -> EmbedOptions {
let defaults = &self.defaults;
if !defaults.headers.is_empty() {
let mut headers = defaults.headers.clone();
headers.merge(&options.headers);
options.headers = headers;
}
if !defaults.provider_options.is_empty() {
options.provider_options =
merge_provider_options(&defaults.provider_options, options.provider_options);
}
options
}
}
impl EmbeddingModelMiddleware for DefaultEmbeddingSettings {
fn transform_params<'a>(
&'a self,
options: EmbedOptions,
_ctx: EmbeddingMiddlewareContext<'a>,
) -> BoxFuture<'a, Result<EmbedOptions, ProviderError>> {
let options = self.apply(options);
Box::pin(async move { Ok(options) })
}
}