shape_runtime/data/
query.rs1use super::Timeframe;
6
7#[derive(Debug, Clone)]
9pub struct DataQuery {
10 pub id: String,
12 pub timeframe: Timeframe,
14 pub start: Option<i64>,
16 pub end: Option<i64>,
18 pub limit: Option<usize>,
20}
21
22impl DataQuery {
23 pub fn new(id: &str, timeframe: Timeframe) -> Self {
25 Self {
26 id: id.to_string(),
27 timeframe,
28 start: None,
29 end: None,
30 limit: None,
31 }
32 }
33
34 pub fn range(mut self, start: i64, end: i64) -> Self {
36 self.start = Some(start);
37 self.end = Some(end);
38 self
39 }
40
41 pub fn start(mut self, start: i64) -> Self {
43 self.start = Some(start);
44 self
45 }
46
47 pub fn end(mut self, end: i64) -> Self {
49 self.end = Some(end);
50 self
51 }
52
53 pub fn limit(mut self, n: usize) -> Self {
55 self.limit = Some(n);
56 self
57 }
58
59 pub fn has_range(&self) -> bool {
61 self.start.is_some() || self.end.is_some()
62 }
63}
64
65impl Default for DataQuery {
66 fn default() -> Self {
67 Self::new("", Timeframe::default())
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74
75 #[test]
76 fn test_query_builder() {
77 let query = DataQuery::new("AAPL", Timeframe::d1())
78 .range(1000, 2000)
79 .limit(100);
80
81 assert_eq!(query.id, "AAPL");
82 assert_eq!(query.start, Some(1000));
83 assert_eq!(query.end, Some(2000));
84 assert_eq!(query.limit, Some(100));
85 }
86}