arxiv/
query.rs

1use crate::{ArxivQuery, ArxivQueryBuilder};
2
3impl ArxivQueryBuilder {
4    pub fn new() -> Self {
5        ArxivQueryBuilder {
6            base_url: "http://export.arxiv.org/api/query?".to_string(),
7            ..ArxivQueryBuilder::default()
8        }
9    }
10    /// Build ArxivQuery from ArxivQueryBuilder.
11    pub fn build(&self) -> ArxivQuery {
12        ArxivQuery {
13            base_url: self.base_url.clone(),
14            search_query: self.search_query.clone(),
15            id_list: self.id_list.clone(),
16            start: self.start,
17            max_results: self.max_results,
18            sort_by: self.sort_by.clone(),
19            sort_order: self.sort_order.clone(),
20        }
21    }
22    /// Store the argument value in search_query.
23    pub fn search_query(&self, search_query: &str) -> Self {
24        ArxivQueryBuilder {
25            search_query: search_query.to_string(),
26            ..self.clone()
27        }
28    }
29    /// Store the argument value in id_list.
30    pub fn id_list(&self, id_list: &str) -> Self {
31        ArxivQueryBuilder {
32            id_list: id_list.to_string(),
33            ..self.clone()
34        }
35    }
36    /// Store the argument value in start.
37    pub fn start(&self, start: i32) -> Self {
38        ArxivQueryBuilder {
39            start: Some(start),
40            ..self.clone()
41        }
42    }
43    /// Store the argument value in max_results.
44    pub fn max_results(&self, max_results: i32) -> Self {
45        ArxivQueryBuilder {
46            max_results: Some(max_results),
47            ..self.clone()
48        }
49    }
50    /// Store the argument value in sort_by.
51    pub fn sort_by(&self, sort_by: &str) -> Self {
52        ArxivQueryBuilder {
53            sort_by: sort_by.to_string(),
54            ..self.clone()
55        }
56    }
57    /// Store the argument value in sort_order.
58    pub fn sort_order(&self, sort_order: &str) -> Self {
59        ArxivQueryBuilder {
60            sort_order: sort_order.to_string(),
61            ..self.clone()
62        }
63    }
64}
65
66impl ArxivQuery {
67    /// Generate a URL string.
68    pub fn to_url(&self) -> String {
69        let mut querys = Vec::new();
70        if !self.search_query.is_empty() {
71            querys.push(format!("search_query={}", self.search_query));
72        }
73        if !self.id_list.is_empty() {
74            querys.push(format!("id_list={}", self.id_list));
75        }
76        if let Some(start) = self.start {
77            querys.push(format!("start={}", start));
78        }
79        if let Some(max_results) = self.max_results {
80            querys.push(format!("max_results={}", max_results));
81        }
82        if !self.sort_by.is_empty() {
83            querys.push(format!("sortBy={}", self.sort_by));
84        }
85        if !self.sort_order.is_empty() {
86            querys.push(format!("sortOrder={}", self.sort_order));
87        }
88        format!("{}{}", self.base_url, querys.join("&"))
89    }
90}