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}
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}