use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use crate::{dates::Date, names::Name, ordinaries::OrdinaryValue};
#[derive(Debug, Default, Clone, Hash, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Item {
pub id: String,
#[serde(rename = "type")]
pub item_type: ItemType,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub author: Vec<Name>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub contributor: Vec<Name>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issued: Option<Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated: Option<Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub published: Option<Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub accessed: Option<Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub category: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "ISSN")]
pub issn: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "EISSN")]
pub eissn: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "ISSNL")]
pub issnl: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "DOI")]
pub doi: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "URL")]
pub url: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title_short: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub summary: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "abstract")]
pub abstract_text: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub container_title: Option<OrdinaryValue>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "journalAbbreviation"
)]
pub journal_abbrevation: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub volume: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issue: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub language: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rights: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub license: Option<OrdinaryValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub note: Option<OrdinaryValue>,
#[serde(flatten)]
pub fields: BTreeMap<String, ItemValue>,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ItemValue {
Ordinary(OrdinaryValue),
Date(Date),
Names(Vec<Name>),
}
#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[allow(missing_docs)]
pub enum ItemType {
Article,
ArticleJournal,
ArticleMagazine,
ArticleNewspaper,
Bill,
Book,
Broadcast,
Chapter,
Classic,
Collection,
Dataset,
Document,
Entry,
EntryDictionary,
EntryEncyclopedia,
Figure,
Graphic,
Hearing,
Interview,
LegalCase,
Legislation,
Manuscript,
Map,
MotionPicture,
MusicalScore,
Pamphlet,
PaperConference,
Patent,
Performance,
Periodical,
PersonalCommunication,
Post,
PostWeblog,
Regulation,
Report,
Review,
ReviewBook,
Software,
Song,
Speech,
Standard,
Thesis,
Treaty,
Webpage,
Gazette,
Video,
LegalCommentary,
}
impl Default for ItemType {
fn default() -> Self {
Self::Article
}
}