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 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 pub fn search_query(&self, search_query: &str) -> Self {
24 ArxivQueryBuilder {
25 search_query: search_query.to_string(),
26 ..self.clone()
27 }
28 }
29 pub fn id_list(&self, id_list: &str) -> Self {
31 ArxivQueryBuilder {
32 id_list: id_list.to_string(),
33 ..self.clone()
34 }
35 }
36 pub fn start(&self, start: i32) -> Self {
38 ArxivQueryBuilder {
39 start: Some(start),
40 ..self.clone()
41 }
42 }
43 pub fn max_results(&self, max_results: i32) -> Self {
45 ArxivQueryBuilder {
46 max_results: Some(max_results),
47 ..self.clone()
48 }
49 }
50 pub fn sort_by(&self, sort_by: &str) -> Self {
52 ArxivQueryBuilder {
53 sort_by: sort_by.to_string(),
54 ..self.clone()
55 }
56 }
57 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 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}