Skip to main content

ss_tools/
structs.rs

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}