use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use crate::models::Content;
use crate::{Model, Tool, ToolConfig};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CachedContent {
pub name: String,
pub model: Model,
#[serde(with = "time::serde::rfc3339")]
pub create_time: OffsetDateTime,
#[serde(with = "time::serde::rfc3339")]
pub update_time: OffsetDateTime,
pub usage_metadata: CacheUsageMetadata,
#[serde(flatten)]
pub expiration: CacheExpirationResponse,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contents: Option<Vec<Content>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system_instruction: Option<Content>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_config: Option<ToolConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CacheUsageMetadata {
pub total_token_count: i32,
}
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(untagged)]
pub enum CacheExpirationRequest {
ExpireTime {
#[serde(with = "time::serde::rfc3339")]
expire_time: OffsetDateTime,
},
Ttl { ttl: String },
}
impl CacheExpirationRequest {
pub fn from_ttl(duration: std::time::Duration) -> Self {
Self::Ttl { ttl: format!("{}s", duration.as_secs()) }
}
pub fn from_expire_time(expire_time: OffsetDateTime) -> Self {
Self::ExpireTime { expire_time }
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CacheExpirationResponse {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default, with = "time::serde::rfc3339::option")]
pub expire_time: Option<OffsetDateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ttl: Option<String>,
}
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CreateCachedContentRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
pub model: Model,
#[serde(skip_serializing_if = "Option::is_none")]
pub contents: Option<Vec<Content>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system_instruction: Option<Content>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_config: Option<ToolConfig>,
#[serde(flatten)]
pub expiration: CacheExpirationRequest,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CachedContentSummary {
pub name: String,
pub model: Model,
#[serde(with = "time::serde::rfc3339")]
pub create_time: OffsetDateTime,
#[serde(with = "time::serde::rfc3339")]
pub update_time: OffsetDateTime,
pub usage_metadata: CacheUsageMetadata,
#[serde(flatten)]
pub expiration: CacheExpirationResponse,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct ListCachedContentsResponse {
#[serde(default)]
pub cached_contents: Vec<CachedContentSummary>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_page_token: Option<String>,
}