use serde::{Deserialize, Serialize};
use url::Url;
use crate::{
identifiers::Identifier,
names::{EntityName, Name},
Date, License,
};
#[derive(Debug, Default, Clone, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Reference {
#[serde(rename = "type")]
pub work_type: RefType,
pub authors: Vec<Name>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub abbreviation: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "abstract")]
pub abstract_text: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub collection_doi: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub collection_title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub collection_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub commit: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub conference: Option<EntityName>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub contact: Vec<Name>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub copyright: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub data_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub database_provider: Option<EntityName>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub database: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub date_accessed: Option<Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub date_downloaded: Option<Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub date_published: Option<Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub date_released: Option<Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub department: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub doi: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub edition: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub editors: Vec<Name>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub editors_series: Vec<Name>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub start: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub end: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub entry: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filename: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub identifiers: Vec<Identifier>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub institution: Option<EntityName>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub isbn: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issn: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issue: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issue_date: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issue_title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub journal: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub keywords: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub languages: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub license: Option<License>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub license_url: Option<Url>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub loc_end: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub loc_start: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub location: Option<EntityName>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub medium: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub month: Option<u8>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nihmsid: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub number_volumes: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pages: Option<u64>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub patent_states: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pmcid: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub publisher: Option<EntityName>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub recipients: Vec<Name>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repository: Option<Url>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repository_artifact: Option<Url>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repository_code: Option<Url>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scope: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub section: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub senders: Vec<Name>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<PublicationStatus>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub term: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thesis_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub translators: Vec<Name>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<Url>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub volume: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub volume_title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub year: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub year_original: Option<i64>,
}
#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[allow(missing_docs)]
pub enum PublicationStatus {
Abstract,
AdvanceOnline,
InPreparation,
InPress,
Preprint,
Submitted,
}
#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[allow(missing_docs)]
pub enum RefType {
Art,
Article,
Audiovisual,
Bill,
Blog,
Book,
Catalogue,
ConferencePaper,
Conference,
Data,
Database,
Dictionary,
EditedWork,
Encyclopedia,
FilmBroadcast,
Generic,
GovernmentDocument,
Grant,
Hearing,
HistoricalWork,
LegalCase,
LegalRule,
MagazineArticle,
Manual,
Map,
Multimedia,
Music,
NewspaperArticle,
Pamphlet,
Patent,
PersonalCommunication,
Proceedings,
Report,
Serial,
Slides,
SoftwareCode,
SoftwareContainer,
SoftwareExecutable,
SoftwareVirtualMachine,
Software,
SoundRecording,
Standard,
Statute,
Thesis,
Unpublished,
Video,
Website,
}
impl Default for RefType {
fn default() -> Self {
Self::Generic
}
}