use std::fmt::Display;
use super::segment::Segment;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Query {
AbsoluteQuery(AbsoluteQuery),
RelativeQuery(RelativeQuery),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct AbsoluteQuery {
segments: Vec<Segment>,
}
impl AbsoluteQuery {
pub fn new(segments: Vec<Segment>) -> AbsoluteQuery {
AbsoluteQuery { segments }
}
pub fn segments(&self) -> &[Segment] {
&self.segments
}
}
impl Display for AbsoluteQuery {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let segments = self
.segments
.iter()
.map(|s| s.to_string())
.collect::<Vec<String>>()
.join("");
write!(f, "${segments}")
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RelativeQuery {
segments: Vec<Segment>,
}
impl RelativeQuery {
pub fn new(segments: Vec<Segment>) -> RelativeQuery {
RelativeQuery { segments }
}
pub fn segments(&self) -> &[Segment] {
&self.segments
}
}