1use serde::{Deserialize, Serialize};
4use url::Url;
5
6use crate::{
7 identifiers::Identifier,
8 names::{EntityName, Name},
9 Date, License,
10};
11
12#[derive(Debug, Default, Clone, Eq, PartialEq, Serialize, Deserialize)]
14#[serde(rename_all = "kebab-case")]
15pub struct Reference {
16 #[serde(rename = "type")]
20 pub work_type: RefType,
21
22 pub authors: Vec<Name>,
26
27 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub abbreviation: Option<String>,
30
31 #[serde(default, skip_serializing_if = "Option::is_none", rename = "abstract")]
39 pub abstract_text: Option<String>,
40
41 #[serde(default, skip_serializing_if = "Option::is_none")]
43 pub collection_doi: Option<String>,
44
45 #[serde(default, skip_serializing_if = "Option::is_none")]
47 pub collection_title: Option<String>,
48
49 #[serde(default, skip_serializing_if = "Option::is_none")]
53 pub collection_type: Option<String>,
54
55 #[serde(default, skip_serializing_if = "Option::is_none")]
63 pub commit: Option<String>,
64
65 #[serde(default, skip_serializing_if = "Option::is_none")]
67 pub conference: Option<EntityName>,
68
69 #[serde(default, skip_serializing_if = "Vec::is_empty")]
71 pub contact: Vec<Name>,
72
73 #[serde(default, skip_serializing_if = "Option::is_none")]
75 pub copyright: Option<String>,
76
77 #[serde(default, skip_serializing_if = "Option::is_none")]
79 pub data_type: Option<String>,
80
81 #[serde(default, skip_serializing_if = "Option::is_none")]
83 pub database_provider: Option<EntityName>,
84
85 #[serde(default, skip_serializing_if = "Option::is_none")]
87 pub database: Option<String>,
88
89 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub date_accessed: Option<Date>,
92
93 #[serde(default, skip_serializing_if = "Option::is_none")]
95 pub date_downloaded: Option<Date>,
96
97 #[serde(default, skip_serializing_if = "Option::is_none")]
99 pub date_published: Option<Date>,
100
101 #[serde(default, skip_serializing_if = "Option::is_none")]
103 pub date_released: Option<Date>,
104
105 #[serde(default, skip_serializing_if = "Option::is_none")]
107 pub department: Option<String>,
108
109 #[serde(default, skip_serializing_if = "Option::is_none")]
111 pub doi: Option<String>,
112
113 #[serde(default, skip_serializing_if = "Option::is_none")]
115 pub edition: Option<String>,
116
117 #[serde(default, skip_serializing_if = "Vec::is_empty")]
119 pub editors: Vec<Name>,
120
121 #[serde(default, skip_serializing_if = "Vec::is_empty")]
123 pub editors_series: Vec<Name>,
124
125 #[serde(default, skip_serializing_if = "Option::is_none")]
127 pub start: Option<u64>,
128
129 #[serde(default, skip_serializing_if = "Option::is_none")]
131 pub end: Option<u64>,
132
133 #[serde(default, skip_serializing_if = "Option::is_none")]
135 pub entry: Option<String>,
136
137 #[serde(default, skip_serializing_if = "Option::is_none")]
139 pub filename: Option<String>,
140
141 #[serde(default, skip_serializing_if = "Option::is_none")]
143 pub format: Option<String>,
144
145 #[serde(default, skip_serializing_if = "Vec::is_empty")]
147 pub identifiers: Vec<Identifier>,
148
149 #[serde(default, skip_serializing_if = "Option::is_none")]
151 pub institution: Option<EntityName>,
152
153 #[serde(default, skip_serializing_if = "Option::is_none")]
159 pub isbn: Option<String>,
160
161 #[serde(default, skip_serializing_if = "Option::is_none")]
167 pub issn: Option<String>,
168
169 #[serde(default, skip_serializing_if = "Option::is_none")]
171 pub issue: Option<String>,
172
173 #[serde(default, skip_serializing_if = "Option::is_none")]
177 pub issue_date: Option<String>,
178
179 #[serde(default, skip_serializing_if = "Option::is_none")]
181 pub issue_title: Option<String>,
182
183 #[serde(default, skip_serializing_if = "Option::is_none")]
185 pub journal: Option<String>,
186
187 #[serde(default, skip_serializing_if = "Vec::is_empty")]
189 pub keywords: Vec<String>,
190
191 #[serde(default, skip_serializing_if = "Vec::is_empty")]
196 pub languages: Vec<String>,
197
198 #[serde(default, skip_serializing_if = "Option::is_none")]
200 pub license: Option<License>,
201
202 #[serde(default, skip_serializing_if = "Option::is_none")]
207 pub license_url: Option<Url>,
208
209 #[serde(default, skip_serializing_if = "Option::is_none")]
211 pub loc_end: Option<u64>,
212
213 #[serde(default, skip_serializing_if = "Option::is_none")]
215 pub loc_start: Option<u64>,
216
217 #[serde(default, skip_serializing_if = "Option::is_none")]
219 pub location: Option<EntityName>,
220
221 #[serde(default, skip_serializing_if = "Option::is_none")]
223 pub medium: Option<String>,
224
225 #[serde(default, skip_serializing_if = "Option::is_none")]
229 pub month: Option<u8>,
230
231 #[serde(default, skip_serializing_if = "Option::is_none")]
235 pub nihmsid: Option<String>,
236
237 #[serde(default, skip_serializing_if = "Option::is_none")]
243 pub notes: Option<String>,
244
245 #[serde(default, skip_serializing_if = "Option::is_none")]
249 pub number: Option<String>,
250
251 #[serde(default, skip_serializing_if = "Option::is_none")]
254 pub number_volumes: Option<u64>,
255
256 #[serde(default, skip_serializing_if = "Option::is_none")]
258 pub pages: Option<u64>,
259
260 #[serde(default, skip_serializing_if = "Vec::is_empty")]
262 pub patent_states: Vec<String>,
263
264 #[serde(default, skip_serializing_if = "Option::is_none")]
270 pub pmcid: Option<String>,
271
272 #[serde(default, skip_serializing_if = "Option::is_none")]
274 pub publisher: Option<EntityName>,
275
276 #[serde(default, skip_serializing_if = "Vec::is_empty")]
278 pub recipients: Vec<Name>,
279
280 #[serde(default, skip_serializing_if = "Option::is_none")]
287 pub repository: Option<Url>,
288
289 #[serde(default, skip_serializing_if = "Option::is_none")]
291 pub repository_artifact: Option<Url>,
292
293 #[serde(default, skip_serializing_if = "Option::is_none")]
295 pub repository_code: Option<Url>,
296
297 #[serde(default, skip_serializing_if = "Option::is_none")]
299 pub scope: Option<String>,
300
301 #[serde(default, skip_serializing_if = "Option::is_none")]
303 pub section: Option<String>,
304
305 #[serde(default, skip_serializing_if = "Vec::is_empty")]
307 pub senders: Vec<Name>,
308
309 #[serde(default, skip_serializing_if = "Option::is_none")]
311 pub status: Option<PublicationStatus>,
312
313 #[serde(default, skip_serializing_if = "Option::is_none")]
315 pub term: Option<String>,
316
317 #[serde(default, skip_serializing_if = "Option::is_none")]
319 pub thesis_type: Option<String>,
320
321 #[serde(default, skip_serializing_if = "Option::is_none")]
323 pub title: Option<String>,
324
325 #[serde(default, skip_serializing_if = "Vec::is_empty")]
327 pub translators: Vec<Name>,
328
329 #[serde(default, skip_serializing_if = "Option::is_none")]
331 pub url: Option<Url>,
332
333 #[serde(default, skip_serializing_if = "Option::is_none")]
335 pub version: Option<String>,
336
337 #[serde(default, skip_serializing_if = "Option::is_none")]
339 pub volume: Option<u64>,
340
341 #[serde(default, skip_serializing_if = "Option::is_none")]
343 pub volume_title: Option<String>,
344
345 #[serde(default, skip_serializing_if = "Option::is_none")]
347 pub year: Option<u64>,
348
349 #[serde(default, skip_serializing_if = "Option::is_none")]
351 pub year_original: Option<i64>,
352}
353
354#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)]
356#[serde(rename_all = "kebab-case")]
357#[allow(missing_docs)]
358pub enum PublicationStatus {
359 Abstract,
360 AdvanceOnline,
361 InPreparation,
362 InPress,
363 Preprint,
364 Submitted,
365}
366
367#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)]
369#[serde(rename_all = "kebab-case")]
370#[allow(missing_docs)]
371pub enum RefType {
372 Art,
373 Article,
374 Audiovisual,
375 Bill,
376 Blog,
377 Book,
378 Catalogue,
379 ConferencePaper,
380 Conference,
381 Data,
382 Database,
383 Dictionary,
384 EditedWork,
385 Encyclopedia,
386 FilmBroadcast,
387 Generic,
388 GovernmentDocument,
389 Grant,
390 Hearing,
391 HistoricalWork,
392 LegalCase,
393 LegalRule,
394 MagazineArticle,
395 Manual,
396 Map,
397 Multimedia,
398 Music,
399 NewspaperArticle,
400 Pamphlet,
401 Patent,
402 PersonalCommunication,
403 Proceedings,
404 Report,
405 Serial,
406 Slides,
407 SoftwareCode,
408 SoftwareContainer,
409 SoftwareExecutable,
410 SoftwareVirtualMachine,
411 Software,
412 SoundRecording,
413 Standard,
414 Statute,
415 Thesis,
416 Unpublished,
417 Video,
418 Website,
419}
420
421impl Default for RefType {
422 fn default() -> Self {
423 Self::Generic
424 }
425}