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