pubmed_client/pubmed/
responses.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Serialize, Deserialize)]
4pub(crate) struct ESearchResult {
5    pub esearchresult: ESearchData,
6}
7
8#[derive(Debug, Serialize, Deserialize)]
9pub(crate) struct ESearchData {
10    #[serde(default, rename = "ERROR")]
11    pub error: Option<String>,
12    #[serde(default)]
13    pub count: Option<String>,
14    #[serde(default)]
15    pub retmax: Option<String>,
16    #[serde(default)]
17    pub retstart: Option<String>,
18    #[serde(default)]
19    pub idlist: Vec<String>,
20    /// WebEnv session identifier for history server
21    #[serde(default)]
22    pub webenv: Option<String>,
23    /// Query key for history server
24    #[serde(default, rename = "querykey")]
25    pub query_key: Option<String>,
26    /// How PubMed interpreted and translated the search query
27    #[serde(default)]
28    pub querytranslation: Option<String>,
29}
30
31// EPost API response structures
32#[derive(Debug, Serialize, Deserialize)]
33pub(crate) struct EPostResponse {
34    pub epostresult: EPostData,
35}
36
37#[derive(Debug, Serialize, Deserialize)]
38pub(crate) struct EPostData {
39    #[serde(default)]
40    pub webenv: Option<String>,
41    #[serde(default, rename = "querykey")]
42    pub query_key: Option<String>,
43    #[serde(default, rename = "ERROR")]
44    pub error: Option<String>,
45}
46
47// EInfo API response structures
48#[derive(Debug, Serialize, Deserialize)]
49pub(crate) struct EInfoResponse {
50    #[serde(rename = "einforesult")]
51    pub einfo_result: EInfoResult,
52}
53
54#[derive(Debug, Serialize, Deserialize)]
55pub(crate) struct EInfoResult {
56    #[serde(rename = "dblist", default)]
57    pub db_list: Option<Vec<String>>,
58    #[serde(rename = "dbinfo", default)]
59    pub db_info: Option<Vec<EInfoDbInfo>>,
60}
61
62#[derive(Debug, Serialize, Deserialize)]
63pub(crate) struct EInfoDbInfo {
64    #[serde(rename = "dbname")]
65    pub db_name: String,
66    #[serde(rename = "menuname")]
67    pub menu_name: String,
68    #[serde(rename = "description")]
69    pub description: String,
70    #[serde(rename = "dbbuild")]
71    pub db_build: Option<String>,
72    #[serde(rename = "count")]
73    pub count: Option<String>,
74    #[serde(rename = "lastupdate")]
75    pub last_update: Option<String>,
76    #[serde(rename = "fieldlist")]
77    pub field_list: Option<Vec<EInfoField>>,
78    #[serde(rename = "linklist")]
79    pub link_list: Option<Vec<EInfoLink>>,
80}
81
82#[derive(Debug, Serialize, Deserialize)]
83pub(crate) struct EInfoField {
84    #[serde(rename = "name")]
85    pub name: String,
86    #[serde(rename = "fullname")]
87    pub full_name: String,
88    #[serde(rename = "description")]
89    pub description: String,
90    #[serde(rename = "termcount")]
91    pub term_count: Option<String>,
92    #[serde(rename = "isdate")]
93    pub is_date: Option<String>,
94    #[serde(rename = "isnumerical")]
95    pub is_numerical: Option<String>,
96    #[serde(rename = "singletoken")]
97    pub single_token: Option<String>,
98    #[serde(rename = "hierarchy")]
99    pub hierarchy: Option<String>,
100    #[serde(rename = "ishidden")]
101    pub is_hidden: Option<String>,
102}
103
104#[derive(Debug, Serialize, Deserialize)]
105pub(crate) struct EInfoLink {
106    #[serde(rename = "name")]
107    pub name: String,
108    #[serde(rename = "menu")]
109    pub menu: String,
110    #[serde(rename = "description")]
111    pub description: String,
112    #[serde(rename = "dbto")]
113    pub db_to: String,
114}
115
116// ESummary API response structures
117
118/// ESummary returns a JSON object with "result" containing "uids" array and per-UID objects.
119/// We use serde_json::Value to handle the dynamic per-UID keys, then parse manually.
120#[derive(Debug, Serialize, Deserialize)]
121pub(crate) struct ESummaryResponse {
122    pub result: serde_json::Value,
123}
124
125#[derive(Debug, Serialize, Deserialize)]
126pub(crate) struct ESummaryAuthor {
127    pub name: String,
128    #[serde(default)]
129    pub authtype: String,
130}
131
132#[derive(Debug, Serialize, Deserialize)]
133pub(crate) struct ESummaryArticleId {
134    pub idtype: String,
135    #[serde(default)]
136    pub value: String,
137}
138
139#[derive(Debug, Serialize, Deserialize)]
140pub(crate) struct ESummaryDocSum {
141    pub uid: String,
142    #[serde(default)]
143    pub title: String,
144    #[serde(default, rename = "sorttitle")]
145    pub sort_title: String,
146    #[serde(default)]
147    pub source: String,
148    #[serde(default)]
149    pub authors: Vec<ESummaryAuthor>,
150    #[serde(default)]
151    pub pubdate: String,
152    #[serde(default)]
153    pub epubdate: String,
154    #[serde(default)]
155    pub volume: String,
156    #[serde(default)]
157    pub issue: String,
158    #[serde(default)]
159    pub pages: String,
160    #[serde(default)]
161    pub lang: Vec<String>,
162    #[serde(default)]
163    pub issn: String,
164    #[serde(default)]
165    pub essn: String,
166    #[serde(default)]
167    pub pubtype: Vec<String>,
168    #[serde(default)]
169    pub articleids: Vec<ESummaryArticleId>,
170    #[serde(default)]
171    pub fulljournalname: String,
172    #[serde(default)]
173    pub sortpubdate: String,
174    #[serde(default)]
175    pub pmcrefcount: u64,
176    #[serde(default)]
177    pub recordstatus: String,
178}
179
180// ELink API response structures
181#[derive(Debug, Serialize, Deserialize)]
182pub(crate) struct ELinkResponse {
183    #[serde(rename = "linksets")]
184    pub linksets: Vec<ELinkSet>,
185}
186
187#[derive(Debug, Serialize, Deserialize)]
188pub(crate) struct ELinkSet {
189    #[serde(rename = "dbfrom")]
190    pub db_from: String,
191    #[serde(rename = "ids")]
192    pub ids: Vec<String>,
193    #[serde(rename = "linksetdbs", default)]
194    pub linkset_dbs: Option<Vec<ELinkSetDb>>,
195}
196
197#[derive(Debug, Serialize, Deserialize)]
198pub(crate) struct ELinkSetDb {
199    #[serde(rename = "dbto")]
200    pub db_to: String,
201    #[serde(rename = "linkname")]
202    pub link_name: String,
203    #[serde(rename = "links")]
204    pub links: Vec<String>,
205}