1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, PartialEq, Default)]
4pub enum Endpoint {
5 #[default]
6 GetMultiplePpaerDetails,
7 GetAPaperByTitle,
8 GetPapersByTitle,
9 GetPaperDetails,
10 GetAuthorDetails,
11 GetReferencesOfAPaper,
12 GetCitationsOfAPaper,
13 SearchAuthors,
14 GetAuthorPapers,
15 GetPaperAuthors,
16}
17
18#[derive(Debug, Clone, Default, PartialEq)]
19pub enum AuthorField {
20 #[default]
21 AuthorId,
22 Name,
23 Url,
24 Affiliations,
25 Homepage,
26 PaperCount,
27 CitationCount,
28 HIndex,
29}
30
31impl AuthorField {
32 pub fn to_string(&self) -> String {
33 match self {
34 AuthorField::AuthorId => "authorId".to_string(),
35 AuthorField::Name => "name".to_string(),
36 AuthorField::Url => "url".to_string(),
37 AuthorField::Affiliations => "affiliations".to_string(),
38 AuthorField::Homepage => "homepage".to_string(),
39 AuthorField::PaperCount => "paperCount".to_string(),
40 AuthorField::CitationCount => "citationCount".to_string(),
41 AuthorField::HIndex => "hIndex".to_string(),
42 }
43 }
44}
45
46#[derive(Debug, Clone, Default, PartialEq)]
47pub enum PaperField {
48 #[default]
49 PaperId,
50 Corpusid,
51 Url,
52 Title,
53 Abstract,
54 Venue,
55 PublicationVenue,
56 Year,
57 ReferenceCount,
58 CitationCount,
59 InfluentialCitationCount,
60 IsOpenAccess,
61 OpenAccessPdf,
62 FieldsOfStudy,
63 S2FieldsOfStudy,
64 PublicationTypes,
65 PublicationDate,
66 Journal,
67 CitationStyles,
68 Authors(Vec<AuthorField>),
69 Citations(Vec<PaperField>),
70 References(Vec<PaperField>),
71 Embedding,
72 Contexts,
73 Intents,
74 IsInfluential,
75 ContextsWithIntent,
76 ExternalIds,
77}
78
79impl PaperField {
80 pub fn to_string(&self) -> String {
81 match self {
82 PaperField::PaperId => "paperId".to_string(),
83 PaperField::Corpusid => "corpusId".to_string(),
84 PaperField::Url => "url".to_string(),
85 PaperField::Title => "title".to_string(),
86 PaperField::Abstract => "abstract".to_string(),
87 PaperField::Venue => "venue".to_string(),
88 PaperField::PublicationVenue => "publicationVenue".to_string(),
89 PaperField::Year => "year".to_string(),
90 PaperField::ReferenceCount => "referenceCount".to_string(),
91 PaperField::CitationCount => "citationCount".to_string(),
92 PaperField::InfluentialCitationCount => "influentialCitationCount".to_string(),
93 PaperField::IsOpenAccess => "isOpenAccess".to_string(),
94 PaperField::OpenAccessPdf => "openAccessPdf".to_string(),
95 PaperField::FieldsOfStudy => "fieldsOfStudy".to_string(),
96 PaperField::S2FieldsOfStudy => "s2FieldsOfStudy".to_string(),
97 PaperField::PublicationTypes => "publicationTypes".to_string(),
98 PaperField::PublicationDate => "publicationDate".to_string(),
99 PaperField::Journal => "journal".to_string(),
100 PaperField::CitationStyles => "citationStyles".to_string(),
101 PaperField::Authors(fields) => {
102 let fields = fields
103 .iter()
104 .map(|field| format!("authors.{}", field.to_string()))
105 .collect::<Vec<String>>()
106 .join(",");
107 return fields;
108 }
109 PaperField::Citations(fields) => {
110 let fields = fields
111 .iter()
112 .map(|field| format!("citations.{}", field.to_string()))
113 .collect::<Vec<String>>()
114 .join(",");
115 return fields;
116 }
117 PaperField::References(fields) => {
118 let fields = fields
119 .iter()
120 .map(|field| format!("references.{}", field.to_string()))
121 .collect::<Vec<String>>()
122 .join(",");
123 return fields;
124 }
125 PaperField::Embedding => "embedding.specter_v2".to_string(),
126 PaperField::Contexts => "contexts".to_string(),
127 PaperField::Intents => "intents".to_string(),
128 PaperField::IsInfluential => "isInfluential".to_string(),
129 PaperField::ContextsWithIntent => "contextsWithIntent".to_string(),
130 PaperField::ExternalIds => "externalIds".to_string(),
131 }
132 }
133}
134
135#[derive(Debug, Clone, Default, PartialEq)]
136pub enum PublicationTypes {
137 #[default]
138 Review,
139 JournalArticle,
140 CaseReport,
141 ClinicalTrial,
142 Conference,
143 Dataset,
144 Editorial,
145 LettersAndComments,
146 MetaAnalysis,
147 News,
148 Study,
149 Book,
150 BookSection,
151}
152
153impl PublicationTypes {
154 pub fn to_string(&self) -> String {
155 match self {
156 PublicationTypes::Review => "Review".to_string(),
157 PublicationTypes::JournalArticle => "JournalArticle".to_string(),
158 PublicationTypes::CaseReport => "CaseReport".to_string(),
159 PublicationTypes::ClinicalTrial => "Clinical Trial".to_string(),
160 PublicationTypes::Conference => "Conference".to_string(),
161 PublicationTypes::Dataset => "Dataset".to_string(),
162 PublicationTypes::Editorial => "Editorial".to_string(),
163 PublicationTypes::LettersAndComments => "LettersAndComments".to_string(),
164 PublicationTypes::MetaAnalysis => "Meta-Analysis".to_string(),
165 PublicationTypes::News => "News".to_string(),
166 PublicationTypes::Study => "Study".to_string(),
167 PublicationTypes::Book => "Book".to_string(),
168 PublicationTypes::BookSection => "Book Section".to_string(),
169 }
170 }
171}
172
173#[derive(Debug, Clone, Default, PartialEq)]
174pub enum FieldsOfStudy {
175 #[default]
176 ComputerScience,
177 Medicine,
178 Chemistry,
179 Biology,
180 MaterialsScience,
181 Physics,
182 Geology,
183 Psychology,
184 Art,
185 Histroy,
186 Geography,
187 Sociology,
188 Business,
189 PoliticalScience,
190 Economics,
191 Philosophy,
192 Mathematics,
193 Engineering,
194 EnvironmentalScience,
195 AgriculturalAndFoodScience,
196 Education,
197 Law,
198 Linguistics,
199}
200
201impl FieldsOfStudy {
202 pub fn to_string(&self) -> String {
203 match self {
204 FieldsOfStudy::ComputerScience => "Computer Science".to_string(),
205 FieldsOfStudy::Medicine => "Medicine".to_string(),
206 FieldsOfStudy::Chemistry => "Chemistry".to_string(),
207 FieldsOfStudy::Biology => "Biology".to_string(),
208 FieldsOfStudy::MaterialsScience => "Materials Science".to_string(),
209 FieldsOfStudy::Physics => "Physics".to_string(),
210 FieldsOfStudy::Geology => "Geology".to_string(),
211 FieldsOfStudy::Psychology => "Psychology".to_string(),
212 FieldsOfStudy::Art => "Art".to_string(),
213 FieldsOfStudy::Histroy => "Histroy".to_string(),
214 FieldsOfStudy::Geography => "Geography".to_string(),
215 FieldsOfStudy::Sociology => "Sociology".to_string(),
216 FieldsOfStudy::Business => "Business".to_string(),
217 FieldsOfStudy::PoliticalScience => "Political Science".to_string(),
218 FieldsOfStudy::Economics => "Economics".to_string(),
219 FieldsOfStudy::Philosophy => "Philosophy".to_string(),
220 FieldsOfStudy::Mathematics => "Mathematics".to_string(),
221 FieldsOfStudy::Engineering => "Engineering".to_string(),
222 FieldsOfStudy::EnvironmentalScience => "Environmental Science".to_string(),
223 FieldsOfStudy::AgriculturalAndFoodScience => {
224 "Agricultural and Food Science".to_string()
225 }
226 FieldsOfStudy::Education => "Education".to_string(),
227 FieldsOfStudy::Law => "Law".to_string(),
228 FieldsOfStudy::Linguistics => "Linguistics".to_string(),
229 }
230 }
231}
232
233#[derive(Debug, Clone, Default, Serialize, Deserialize)]
234pub struct PublicationVenue {
235 #[serde(default = "String::new")]
236 pub id: String,
237 #[serde(default = "Option::default")]
238 pub name: Option<String>,
239 #[serde(rename = "type", default = "Option::default")]
240 pub type_name: Option<String>,
241 #[serde(default = "Option::default")]
242 pub url: Option<String>,
243 #[serde(default = "Option::default")]
244 pub alternate_names: Option<Vec<String>>,
245}
246
247#[derive(Debug, Clone, Default, Serialize, Deserialize)]
248pub struct ExternalIds {
249 #[serde(rename = "ArXiv", default = "Option::default")]
250 pub arxiv: Option<String>,
251 #[serde(rename = "DOI", default = "Option::default")]
252 pub doi: Option<String>,
253 #[serde(rename = "DBLP", default = "Option::default")]
254 pub dblp: Option<String>,
255 #[serde(rename = "PubMed", default = "Option::default")]
256 pub pubmed: Option<String>,
257 #[serde(rename = "PubMedCentral", default = "Option::default")]
258 pub pubmed_central: Option<String>,
259 #[serde(rename = "MAG", default = "Option::default")]
260 pub mag: Option<String>,
261 #[serde(rename = "ACL", default = "Option::default")]
262 pub acl: Option<String>,
263 #[serde(rename = "CorpusId", default = "Option::default")]
264 pub corpus_id: Option<u64>,
265}
266
267#[derive(Debug, Clone, Default, Serialize, Deserialize)]
268pub struct OpenAccessPdf {
269 #[serde(default = "Option::default")]
270 pub url: Option<String>,
271 #[serde(default = "Option::default")]
272 pub status: Option<String>,
273}
274
275#[derive(Debug, Clone, Default, Serialize, Deserialize)]
276pub struct S2FieldsOfStudy {
277 #[serde(default = "Option::default")]
278 pub category: Option<String>,
279 #[serde(default = "Option::default")]
280 pub source: Option<String>,
281}
282
283#[derive(Debug, Clone, Default, Serialize, Deserialize)]
284pub struct Journal {
285 #[serde(default = "Option::default")]
286 pub volume: Option<String>,
287 #[serde(default = "Option::default")]
288 pub pages: Option<String>,
289 #[serde(default = "Option::default")]
290 pub name: Option<String>,
291}
292
293#[derive(Debug, Clone, Default, Serialize, Deserialize)]
294pub struct CitationStyles {
295 #[serde(default = "Option::default")]
296 pub bibtex: Option<String>,
297}
298
299#[derive(Debug, Clone, Default, Serialize, Deserialize)]
300pub struct Author {
301 #[serde(rename = "authorId", default = "Option::default")]
302 pub author_id: Option<String>,
303 #[serde(default = "Option::default")]
304 pub url: Option<String>,
305 #[serde(default = "Option::default")]
306 pub name: Option<String>,
307 #[serde(default = "Option::default")]
308 pub affiliations: Option<Vec<String>>,
309 #[serde(default = "Option::default")]
310 pub homepage: Option<String>,
311 #[serde(rename = "paperCount", default = "Option::default")]
312 pub paper_count: Option<u32>,
313 #[serde(rename = "citationCount", default = "Option::default")]
314 pub citation_count: Option<u32>,
315 #[serde(rename = "hIndex", default = "Option::default")]
316 pub hindex: Option<u32>,
317}
318
319#[derive(Debug, Clone, Default, Serialize, Deserialize)]
320pub struct Embedding {
321 #[serde(default = "String::new")]
322 pub model: String,
323 #[serde(default = "Vec::new")]
324 pub vector: Vec<f64>,
325}
326
327#[derive(Debug, Clone, Default, Serialize, Deserialize)]
328pub struct Paper {
329 #[serde(rename = "paperId", default = "Option::default")]
330 pub paper_id: Option<String>,
331 #[serde(rename = "corpusId", default = "Option::default")]
332 pub corpus_id: Option<u32>,
333 #[serde(default = "Option::default")]
334 pub url: Option<String>,
335 #[serde(default = "Option::default")]
336 pub title: Option<String>,
337 #[serde(rename = "abstract", default = "Option::default")]
338 pub abstract_text: Option<String>,
339 #[serde(default = "Option::default")]
340 pub venue: Option<String>,
341 #[serde(rename = "publicationVenue", default = "Option::default")]
342 pub publication_venue: Option<PublicationVenue>,
343 #[serde(default = "Option::default")]
344 pub year: Option<u32>,
345 #[serde(rename = "referenceCount", default = "Option::default")]
346 pub reference_count: Option<u32>,
347 #[serde(rename = "citationCount", default = "Option::default")]
348 pub citation_count: Option<u32>,
349 #[serde(rename = "influentialCitationCount", default = "Option::default")]
350 pub influential_citation_count: Option<u32>,
351 #[serde(rename = "isOpenAccess", default = "Option::default")]
352 pub is_open_access: Option<bool>,
353 #[serde(rename = "openAccessPdf", default = "Option::default")]
354 pub open_access_pdf: Option<OpenAccessPdf>,
355 #[serde(rename = "externalIds", default = "Option::default")]
356 pub external_ids: Option<ExternalIds>,
357 #[serde(rename = "fieldsOfStudy", default = "Option::default")]
358 pub fields_of_study: Option<Vec<String>>,
359 #[serde(rename = "s2FieldsOfStudy", default = "Option::default")]
360 pub s2_fields_of_study: Option<Vec<S2FieldsOfStudy>>,
361 #[serde(rename = "publicationTypes", default = "Option::default")]
362 pub publication_types: Option<Vec<String>>,
363 #[serde(rename = "publicationDate", default = "Option::default")]
364 pub publication_date: Option<String>,
365 #[serde(default = "Option::default")]
366 pub journal: Option<Journal>,
367 #[serde(rename = "citationStyles", default = "Option::default")]
368 pub citation_styles: Option<CitationStyles>,
369 #[serde(default = "Option::default")]
370 pub authors: Option<Vec<Author>>,
371 #[serde(default = "Option::default")]
372 pub citations: Option<Vec<Paper>>,
373 #[serde(default = "Option::default")]
374 pub references: Option<Vec<Paper>>,
375 #[serde(default = "Option::default")]
376 pub embedding: Option<Embedding>,
377 #[serde(rename = "matchScore", default = "Option::default")]
378 pub match_score: Option<f64>,
379}
380
381#[derive(Debug, Clone, Default, Serialize, Deserialize)]
382pub struct PaperIds {
383 #[serde(default = "usize::default")]
384 pub total: usize,
385 #[serde(default = "usize::default")]
386 pub offset: usize,
387 #[serde(default = "String::new")]
388 pub token: String,
389 #[serde(default = "Vec::new")]
390 pub data: Vec<Paper>,
391}
392
393#[derive(Debug, Clone, Default, Serialize, Deserialize)]
394pub struct PaperContext {
395 #[serde(default = "Option::default")]
396 pub context: Option<String>,
397 #[serde(default = "Option::default")]
398 pub intents: Option<Vec<String>>,
399}
400
401#[derive(Debug, Clone, Default, Serialize, Deserialize)]
402pub struct ResponseData {
403 #[serde(default = "Option::default")]
404 pub contexts: Option<Vec<String>>,
405 #[serde(default = "Option::default")]
406 pub intents: Option<Vec<String>>,
407 #[serde(rename = "contextsWithIntent", default = "Option::default")]
408 pub contexts_with_intent: Option<Vec<PaperContext>>,
409 #[serde(default = "Option::default")]
410 pub isinfluential: Option<bool>,
411 #[serde(rename = "citingPaper", default = "Option::default")]
412 pub citing_paper: Option<Paper>,
413}
414
415#[derive(Debug, Clone, Default, Serialize, Deserialize)]
416pub struct ResponsePapers {
417 #[serde(default = "Option::default")]
418 pub offset: Option<u64>,
419 #[serde(default = "Option::default")]
420 pub next: Option<u64>,
421 pub data: Vec<ResponseData>,
422}
423
424#[derive(Debug, Clone, Default, Serialize, Deserialize)]
425pub struct AuthorSearchResponse {
426 #[serde(default = "usize::default")]
427 pub offset: usize,
428 #[serde(default = "Option::default")]
429 pub next: Option<usize>,
430 #[serde(default = "usize::default")]
431 pub total: usize,
432 #[serde(default = "Vec::new")]
433 pub data: Vec<Author>,
434}
435
436#[derive(Debug, Clone, Default, Serialize, Deserialize)]
437pub struct AuthorPapersResponse {
438 #[serde(default = "Option::default")]
439 pub offset: Option<u64>,
440 #[serde(default = "Option::default")]
441 pub next: Option<u64>,
442 #[serde(default = "Vec::new")]
443 pub data: Vec<Paper>,
444}
445
446#[derive(Debug, Clone, Default, Serialize, Deserialize)]
447pub struct PaperAuthorsResponse {
448 #[serde(default = "Option::default")]
449 pub offset: Option<u64>,
450 #[serde(default = "Option::default")]
451 pub next: Option<u64>,
452 #[serde(default = "Vec::new")]
453 pub data: Vec<Author>,
454}