use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::error::Result;
use crate::shared::{Headers, ProviderMetadata, RequestInfo, Warning};
use super::BoxStream;
use super::content::Content;
use super::finish_reason::FinishReason;
use super::stream_part::StreamPart;
use super::usage::Usage;
#[derive(Debug, Clone)]
pub struct GenerateResult {
pub content: Vec<Content>,
pub finish_reason: FinishReason,
pub usage: Usage,
pub provider_metadata: Option<ProviderMetadata>,
pub request: Option<RequestInfo>,
pub response: Option<GenerateResponse>,
pub warnings: Vec<Warning>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct GenerateResponse {
#[serde(flatten)]
pub metadata: ResponseMetadata,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub body: Option<crate::json::JsonValue>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ResponseMetadata {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
#[serde(default, rename = "modelId", skip_serializing_if = "Option::is_none")]
pub model_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub headers: Option<Headers>,
}
#[expect(
missing_debug_implementations,
reason = "BoxStream is not Debug; trait obj has no useful repr"
)]
pub struct StreamResult {
pub stream: BoxStream<Result<StreamPart>>,
pub request: Option<RequestInfo>,
pub response: Option<StreamResponse>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct StreamResponse {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub headers: Option<Headers>,
}
pub type SupportedUrls = HashMap<String, Vec<UrlPattern>>;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct UrlPattern(pub String);
impl UrlPattern {
pub fn new(pattern: impl Into<String>) -> Self {
Self(pattern.into())
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}