Skip to main content

entrez_rs/parser/
esearch.rs

1//! Utilities to parse XML results obtained using [ESearch](super::super::eutils::ESearch).
2 
3//! # Description
4//! When using [ESearch](super::super::eutils::ESearch),
5//! the resulting XML
6//! is as follows:
7//! ``` xml
8//! <?xml version="1.0" encoding="UTF-8" ?>
9//! <!DOCTYPE eSearchResult PUBLIC "-//NLM//DTD esearch 20060628//EN" "https://eutils.ncbi.nlm.nih.gov/eutils/dtd/20060628/esearch.dtd">
10//! <eSearchResult>
11//!    ...
12//! </eSearchResult>
13//!  ```
14//! The [read](ESearchResult::read) function will parse this XML into an [ESearchResult]
15//! struct.
16//! 
17//! # Example
18//! 
19//!  ```
20//!   use entrez_rs::eutils::{Eutils, ESearch, DB};
21//!   use entrez_rs::parser::esearch::{ESearchResult};
22//! 
23//!   let xml = ESearch::new(
24//!         DB::Pubmed, 
25//!         "sars_cov_2") 
26//!         .run().expect("Connection error");
27//! 
28//!   // Use the read function to parse the xml result.
29//!   let parsed = ESearchResult::read(&xml)
30//!                .expect("Parsing error");
31//! 
32//!   assert_eq!(parsed.id_list.ids.len(), 20);
33//!   ```
34
35
36extern crate serde;
37extern crate quick_xml;
38use serde::{Deserialize};
39use quick_xml::de::{from_str, DeError};
40
41
42#[derive(Debug, Deserialize, PartialEq)]
43pub struct IdList {
44    #[serde(rename = "Id", default)]
45    pub ids: Vec<String>
46}
47
48#[derive(Debug, Deserialize, PartialEq)]
49pub struct Translation {
50    #[serde(rename = "From", default)]
51    pub from: String,
52    #[serde(rename = "To", default)]
53    pub to: String,
54}
55
56#[derive(Debug, Deserialize, PartialEq)]
57pub struct TranslationSet {
58    #[serde(rename = "Translation")]
59    pub translation: Vec<Translation>
60}
61
62#[derive(Debug, Deserialize, PartialEq)]
63pub struct TranslationStack {
64    #[serde(rename = "TermSet")]
65    pub term_set: Vec<TermSet>,
66    #[serde(rename = "OP")]
67    pub op: Vec<String>,
68}
69
70#[derive(Debug, Deserialize, PartialEq)]
71pub struct TermSet {
72    #[serde(rename = "Term", default)]
73    pub term: String,
74    #[serde(rename = "Field", default)]
75    pub field: String,
76    #[serde(rename = "Count", default)]
77    pub count: u64,
78    #[serde(rename = "Explode", default)]
79    pub explode: String,
80}
81
82
83#[derive(Debug, Deserialize, PartialEq)]
84pub struct ESearchResult {
85    #[serde(rename = "Count", default)]
86    pub count: u64,
87    #[serde(rename = "RetMax", default)]
88    pub ret_max: u64,
89    #[serde(rename = "RetStart", default)]
90    pub ret_start: u64,
91    #[serde(rename = "QueryKey", default)]
92    pub query_key: u64,
93    #[serde(rename = "WebEnv", default)]
94    pub web_env: String,
95    #[serde(rename = "IdList")]
96    pub id_list: IdList,
97   // #[serde(rename = "TranslationSet")]
98   // translation_set: TranslationSet,
99  //  #[serde(rename = "TranslationStack")]
100  //  translation_stack: TranslationStack,
101    #[serde(rename = "QueryTranslation", default)]
102    pub query_translation: String,
103}
104
105impl ESearchResult {
106    pub fn read(xml: &str) -> Result<ESearchResult, DeError> {
107        from_str(xml)
108    }
109}