prometheus_parser/types/
group.rs1use std::fmt;
4
5use super::expression::{BExpression, Expression};
6use super::return_value::{ReturnKind, ReturnValue};
7use super::misc::{Span, Subquery};
8
9#[derive(Debug, PartialEq, Clone)]
11pub struct Group {
12 pub expression: BExpression,
13 pub subquery: Option<Subquery>,
14 pub span: Option<Span>
15}
16
17impl Group {
18 pub fn new(expression: Expression) -> Self {
19 Group {
20 expression: Box::new(expression),
21 subquery: None,
22 span: None
23 }
24 }
25
26 pub fn subquery(mut self, subquery: Subquery) -> Self {
27 self.subquery = Some(subquery);
28 self
29 }
30
31 pub fn clear_subquery(mut self) -> Self {
32 self.subquery = None;
33 self
34 }
35
36 pub fn span<S: Into<Span>>(mut self, span: S) -> Self {
37 self.span = Some(span.into());
38 self
39 }
40
41 pub fn wrap(self) -> Expression {
43 Expression::Group(self)
44 }
45
46 pub fn return_value(&self) -> ReturnValue {
47 let mut ret = self.expression.return_value();
48
49 if self.subquery.is_some() {
50 ret.kind = match ret.kind {
51 ReturnKind::InstantVector => ReturnKind::RangeVector,
52 _ => ReturnKind::unknown(
53 format!("subquery on inner expression returning {:?} is invalid", ret.kind),
54 self.clone().wrap()
55 )
56 };
57 }
58
59 ret
60 }
61}
62
63impl fmt::Display for Group {
64 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
65 write!(f, "({})", self.expression)?;
66
67 if let Some(subquery) = &self.subquery {
68 write!(f, "{}", subquery)?;
69 }
70
71 Ok(())
72 }
73}