use super::*;
#[derive(Clone)]
pub(super) enum Level {
Relations {
relations: Vec<Relation>,
merge_columns: Vec<Ident>,
},
Lambda(Vec<Ident>),
}
#[derive(Clone, Default)]
pub(super) struct Context {
pub(super) ctes: Vec<CteDecl>,
pub(super) outer: Vec<Level>,
pub(super) excluded_columns: Vec<Ident>,
}
impl Context {
pub(super) fn with_ctes(&self, ctes: Vec<CteDecl>) -> Context {
Context {
ctes,
..self.clone()
}
}
pub(super) fn with_outer(
&self,
relations: Vec<Relation>,
merge_columns: Vec<Ident>,
) -> Context {
self.pushing(Level::Relations {
relations,
merge_columns,
})
}
pub(super) fn with_lambda(&self, params: impl IntoIterator<Item = Ident>) -> Context {
self.pushing(Level::Lambda(params.into_iter().collect()))
}
pub(super) fn with_excluded(&self, columns: Vec<Ident>) -> Context {
let mut child = self.clone();
child.excluded_columns = columns;
child
}
fn pushing(&self, level: Level) -> Context {
let mut child = self.clone();
child.outer.push(level);
child
}
}