use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Metadata {
pub schema_version: String,
pub title: String,
pub authors: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub year: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub doi: Option<crate::Doi>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub arxiv_id: Option<crate::ArxivId>,
#[serde(rename = "abstract", skip_serializing_if = "Option::is_none", default)]
pub abstract_: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub venue: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub publisher: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub issn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub isbn: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none", default)]
pub type_: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub keywords: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub pdf_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub doiget: Option<DoigetExtension>,
#[serde(flatten)]
pub other: std::collections::BTreeMap<String, toml::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DoigetExtension {
pub fetched_at: DateTime<Utc>,
pub source: String,
pub license: String,
pub size_bytes: u64,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub mcp_call_id: Option<String>,
}