#[cfg(feature = "schema")]
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[allow(unused_imports, reason = "Referenced by intra-doc links.")]
use crate::ResolutionError;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum CitationField {
Anthropology,
Biology,
Botany,
Chemistry,
Communications,
Engineering,
Geography,
Geology,
History,
Humanities,
Law,
Linguistics,
Literature,
Math,
Medicine,
Philosophy,
Physics,
#[serde(rename = "political-science")]
PoliticalScience,
Psychology,
Science,
#[serde(rename = "social-science")]
SocialScience,
Sociology,
Theology,
Zoology,
}
#[derive(Debug, Default, Clone, Deserialize, Serialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub struct StyleLink {
pub href: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub rel: Option<String>,
}
#[derive(Debug, Default, Clone, Deserialize, Serialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub struct StylePerson {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uri: Option<String>,
}
#[derive(Debug, Default, Clone, Deserialize, Serialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub struct StyleSource {
pub csl_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub adapted_by: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub license: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub original_authors: Vec<StylePerson>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub links: Vec<StyleLink>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub struct StyleInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_locale: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub fields: Vec<CitationField>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<StyleSource>,
#[serde(skip_serializing_if = "Option::is_none")]
pub short_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub edition: Option<String>,
#[serde(rename = "citum-version", skip_serializing_if = "Option::is_none")]
pub citum_version: Option<String>,
}
impl StyleInfo {
pub fn is_empty(&self) -> bool {
self.title.is_none()
&& self.id.is_none()
&& self.description.is_none()
&& self.default_locale.is_none()
&& self.fields.is_empty()
&& self.source.is_none()
&& self.short_name.is_none()
&& self.edition.is_none()
&& self.citum_version.is_none()
}
}