prometheus_parser/types/
group.rs

1// (C) Copyright 2019 Hewlett Packard Enterprise Development LP
2
3use std::fmt;
4
5use super::expression::{BExpression, Expression};
6use super::return_value::{ReturnKind, ReturnValue};
7use super::misc::{Span, Subquery};
8
9/// An expression explicitly grouped in parens
10#[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  /// Wraps this function in an Expression
42  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}