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