use std::collections::BTreeMap;
use serde_json::{Map, Value};
use crate::auth::OAuthConfig;
use crate::config::provider::{AuthId, HeaderSpec, ModelsOverride, ProtocolId, TransportSpec};
use crate::store::AmbientSpec;
use super::or_map;
#[derive(Default, Clone, Debug, PartialEq, serde::Serialize)]
pub struct PartialProvider {
#[serde(skip_serializing_if = "Option::is_none")]
pub base_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exec: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub protocol: Option<ProtocolId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth: Option<AuthId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub api_header: Option<HeaderSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
pub beta_headers: Option<Vec<(String, String)>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub generation_query: Option<Vec<(String, String)>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model_aliases: Option<BTreeMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model_prefixes: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Map::is_empty")]
pub body_defaults: Map<String, Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unsupported_body_keys: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transport: Option<TransportSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
pub models: Option<ModelsOverride>,
#[serde(skip_serializing_if = "Option::is_none")]
pub oauth: Option<OAuthConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ambient: Option<AmbientSpec>,
}
impl PartialProvider {
pub(super) fn or(self, other: PartialProvider) -> PartialProvider {
PartialProvider {
base_url: self.base_url.or(other.base_url),
exec: self.exec.or(other.exec),
transport: self.transport.or(other.transport),
protocol: self.protocol.or(other.protocol),
auth: self.auth.or(other.auth),
api_header: self.api_header.or(other.api_header),
beta_headers: self.beta_headers.or(other.beta_headers),
generation_query: self.generation_query.or(other.generation_query),
model_aliases: self.model_aliases.or(other.model_aliases),
model_prefixes: self.model_prefixes.or(other.model_prefixes),
body_defaults: or_map(self.body_defaults, other.body_defaults),
unsupported_body_keys: self.unsupported_body_keys.or(other.unsupported_body_keys),
models: self.models.or(other.models),
oauth: self.oauth.or(other.oauth),
ambient: self.ambient.or(other.ambient),
}
}
}