overpass_lib/builder/
query.rs1use chrono::{DateTime, Utc};
2use crate::{Bbox, FilterSet, FilterSetBuilder, Query, QueryVerbosity, Set, UnionSet, UnionSetBuilder};
3#[cfg(doc)]
4use crate::SetBuilder;
5
6pub trait ToQuery<'a>: Into<QueryBuilder<'a>> {
9 fn to_query(self) -> QueryBuilder<'a> {
11 self.into()
12 }
13}
14
15pub struct QueryBuilder<'a>(
17 Query<'a>,
19);
20
21impl<'a> Into<Query<'a>> for QueryBuilder<'a> {
22 fn into(self) -> Query<'a> {
23 self.0
24 }
25}
26
27impl<'a> AsRef<Query<'a>> for QueryBuilder<'a> {
28 fn as_ref(&self) -> &Query<'a> {
29 &self.0
30 }
31}
32
33impl<'a> QueryBuilder<'a> {
34 pub fn timeout(mut self, timeout: u32) -> Self {
36 self.0.timeout_s = Some(timeout);
37 self
38 }
39
40 pub fn max_size(mut self, max_size: u32) -> Self {
42 self.0.max_size = Some(max_size);
43 self
44 }
45
46 pub fn search_bbox(mut self, bbox: impl Into<Bbox>) -> Self {
48 self.0.search_bbox = Some(bbox.into());
49 self
50 }
51
52 pub fn as_of_date(mut self, date: impl Into<DateTime<Utc>>) -> Self {
54 self.0.as_of_date = Some(date.into());
55 self
56 }
57
58 pub fn diff_since(mut self, start: impl Into<DateTime<Utc>>) -> Self {
60 self.0.diff = Some((start.into(), None));
61 self
62 }
63
64 pub fn diff_range(mut self, start: impl Into<DateTime<Utc>>, end: impl Into<DateTime<Utc>>) -> Self {
66 self.0.diff = Some((start.into(), Some(end.into())));
67 self
68 }
69
70 pub fn verbosity(mut self, verbosity: QueryVerbosity) -> Self {
72 self.0.verbosity = verbosity;
73 self
74 }
75}
76
77impl<'a> Into<QueryBuilder<'a>> for FilterSetBuilder<'a> {
78 fn into(self) -> QueryBuilder<'a> {
79 let set: FilterSet = self.0.into();
80 QueryBuilder(Query::from(Set::from(set)))
81 }
82}
83impl<'a> ToQuery<'a> for FilterSetBuilder<'a> {}
84
85impl<'a> Into<QueryBuilder<'a>> for UnionSetBuilder<'a> {
86 fn into(self) -> QueryBuilder<'a> {
87 let set: UnionSet = self.0.into();
88 QueryBuilder(Query::from(Set::from(set)))
89 }
90}
91impl<'a> ToQuery<'a> for UnionSetBuilder<'a> {}