use serde::{Deserialize, Serialize};
use serde_json::Map;
use super::Metadata;
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct ProviderPartInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub provider_name: Option<String>,
#[serde(default, skip_serializing_if = "Map::is_empty")]
pub details: Metadata,
}
impl ProviderPartInfo {
#[must_use]
pub fn new(provider_name: impl Into<String>) -> Self {
Self {
id: None,
provider_name: Some(provider_name.into()),
details: Metadata::default(),
}
}
#[must_use]
pub fn with_id(mut self, id: impl Into<String>) -> Self {
let id = id.into();
if !id.is_empty() {
self.id = Some(id);
}
self
}
#[must_use]
pub fn with_details(mut self, details: Metadata) -> Self {
self.details = details;
self
}
#[must_use]
pub fn is_provider(&self, provider_name: &str) -> bool {
self.provider_name.as_deref() == Some(provider_name)
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ProviderInfo {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub response_id: Option<String>,
#[serde(default, skip_serializing_if = "Map::is_empty")]
pub details: Metadata,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum FinishReason {
Stop,
Length,
ToolCalls,
ContentFilter,
Unknown,
}
impl ProviderPartInfo {
pub(super) fn is_empty(&self) -> bool {
self.id.is_none() && self.provider_name.is_none() && self.details.is_empty()
}
}