Skip to main content

overpass_lib/builder/
query.rs

1use chrono::{DateTime, Utc};
2use crate::{Bbox, FilterSet, FilterSetBuilder, Query, QueryVerbosity, Set, UnionSet, UnionSetBuilder};
3#[cfg(doc)]
4use crate::SetBuilder;
5
6/// Trait to convert [SetBuilder]s into [QueryBuilder]s unambiguously in addition to
7/// [`Into<QueryBuilder>`].
8pub trait ToQuery<'a>: Into<QueryBuilder<'a>> {
9    /// Convert this type into a [QueryBuilder].
10    fn to_query(self) -> QueryBuilder<'a> {
11        self.into()
12    }
13}
14
15/// A convenient builder API for [Query].
16pub struct QueryBuilder<'a>(
17    /// The query being modified.
18    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    /// Set [Query::timeout_s].
35    pub fn timeout(mut self, timeout: u32) -> Self {
36        self.0.timeout_s = Some(timeout);
37        self
38    }
39
40    /// Set [Query::max_size].
41    pub fn max_size(mut self, max_size: u32) -> Self {
42        self.0.max_size = Some(max_size);
43        self
44    }
45
46    /// Set [Query::search_bbox].
47    pub fn search_bbox(mut self, bbox: impl Into<Bbox>) -> Self {
48        self.0.search_bbox = Some(bbox.into());
49        self
50    }
51
52    /// Set [Query::as_of_date].
53    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    /// Set [Query::diff] with no end date.
59    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    /// Set [Query::diff] with an end date.
65    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    /// Set [Query::verbosity].
71    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> {}