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