1use std::collections::BTreeMap;
4
5use serde::{Deserialize, Serialize};
6
7use crate::{dates::Date, names::Name, ordinaries::OrdinaryValue};
8
9#[derive(Debug, Default, Clone, Hash, Eq, PartialEq, Serialize, Deserialize)]
16#[serde(rename_all = "kebab-case")]
17pub struct Item {
18 pub id: String,
20
21 #[serde(rename = "type")]
23 pub item_type: ItemType,
24
25 #[serde(default, skip_serializing_if = "Vec::is_empty")]
27 pub author: Vec<Name>,
28
29 #[serde(default, skip_serializing_if = "Vec::is_empty")]
31 pub contributor: Vec<Name>,
32
33 #[serde(default, skip_serializing_if = "Option::is_none")]
35 pub issued: Option<Date>,
36
37 #[serde(default, skip_serializing_if = "Option::is_none")]
39 pub updated: Option<Date>,
40
41 #[serde(default, skip_serializing_if = "Option::is_none")]
43 pub published: Option<Date>,
44
45 #[serde(default, skip_serializing_if = "Option::is_none")]
47 pub accessed: Option<Date>,
48
49 #[serde(default, skip_serializing_if = "Option::is_none")]
51 pub category: Option<OrdinaryValue>,
52
53 #[serde(default, skip_serializing_if = "Option::is_none", rename = "ISSN")]
55 pub issn: Option<OrdinaryValue>,
56
57 #[serde(default, skip_serializing_if = "Option::is_none", rename = "EISSN")]
59 pub eissn: Option<OrdinaryValue>,
60
61 #[serde(default, skip_serializing_if = "Option::is_none", rename = "ISSNL")]
63 pub issnl: Option<OrdinaryValue>,
64
65 #[serde(default, skip_serializing_if = "Option::is_none", rename = "DOI")]
67 pub doi: Option<OrdinaryValue>,
68
69 #[serde(default, skip_serializing_if = "Option::is_none", rename = "URL")]
71 pub url: Option<OrdinaryValue>,
72
73 #[serde(default, skip_serializing_if = "Option::is_none")]
75 pub title: Option<OrdinaryValue>,
76
77 #[serde(default, skip_serializing_if = "Option::is_none")]
79 pub title_short: Option<OrdinaryValue>,
80
81 #[serde(default, skip_serializing_if = "Option::is_none")]
83 pub summary: Option<OrdinaryValue>,
84
85 #[serde(default, skip_serializing_if = "Option::is_none", rename = "abstract")]
87 pub abstract_text: Option<OrdinaryValue>,
88
89 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub container_title: Option<OrdinaryValue>,
92
93 #[serde(
97 default,
98 skip_serializing_if = "Option::is_none",
99 rename = "journalAbbreviation"
100 )]
101 pub journal_abbrevation: Option<OrdinaryValue>,
102
103 #[serde(default, skip_serializing_if = "Option::is_none")]
107 pub volume: Option<OrdinaryValue>,
108
109 #[serde(default, skip_serializing_if = "Option::is_none")]
113 pub issue: Option<OrdinaryValue>,
114
115 #[serde(default, skip_serializing_if = "Option::is_none")]
120 pub page: Option<OrdinaryValue>,
121
122 #[serde(default, skip_serializing_if = "Option::is_none")]
124 pub language: Option<OrdinaryValue>,
125
126 #[serde(default, skip_serializing_if = "Option::is_none")]
128 pub source: Option<OrdinaryValue>,
129
130 #[serde(default, skip_serializing_if = "Option::is_none")]
132 pub rights: Option<OrdinaryValue>,
133
134 #[serde(default, skip_serializing_if = "Option::is_none")]
138 pub license: Option<OrdinaryValue>,
139
140 #[serde(default, skip_serializing_if = "Option::is_none")]
146 pub note: Option<OrdinaryValue>,
147
148 #[serde(flatten)]
150 pub fields: BTreeMap<String, ItemValue>,
151}
152
153#[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize, Deserialize)]
155#[serde(untagged)]
156pub enum ItemValue {
157 Ordinary(OrdinaryValue),
167
168 Date(Date),
174
175 Names(Vec<Name>),
181}
182
183#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)]
185#[serde(rename_all = "kebab-case")]
186#[allow(missing_docs)]
187pub enum ItemType {
188 Article,
190 ArticleJournal,
191 ArticleMagazine,
192 ArticleNewspaper,
193 Bill,
194 Book,
195 Broadcast,
196 Chapter,
197 Classic,
198 Collection,
199 Dataset,
200 Document,
201 Entry,
202 EntryDictionary,
203 EntryEncyclopedia,
204 Figure,
205 Graphic,
206 Hearing,
207 Interview,
208 LegalCase,
209 Legislation,
210 Manuscript,
211 Map,
212 MotionPicture,
213 MusicalScore,
214 Pamphlet,
215 PaperConference,
216 Patent,
217 Performance,
218 Periodical,
219 PersonalCommunication,
220 Post,
221 PostWeblog,
222 Regulation,
223 Report,
224 Review,
225 ReviewBook,
226 Software,
227 Song,
228 Speech,
229 Standard,
230 Thesis,
231 Treaty,
232 Webpage,
233
234 Gazette,
236 Video,
237 LegalCommentary,
238}
239
240impl Default for ItemType {
241 fn default() -> Self {
242 Self::Article
243 }
244}