use std::rc::Rc;
use crate::{Element, FindSpec, QueryOutput, QueryResults, RowSource, Schema, SqlConn};
use query_projector_traits::errors::Result;
use super::Projector;
pub struct ConstantProjector {
spec: Rc<FindSpec>,
results_factory: Box<dyn Fn() -> QueryResults>,
}
impl ConstantProjector {
pub fn new(
spec: Rc<FindSpec>,
results_factory: Box<dyn Fn() -> QueryResults>,
) -> ConstantProjector {
ConstantProjector {
spec,
results_factory,
}
}
pub fn project_without_rows(&self) -> Result<QueryOutput> {
let results = (self.results_factory)();
let spec = self.spec.clone();
Ok(QueryOutput { spec, results })
}
}
impl Projector for ConstantProjector {
fn project(
&self,
_schema: &Schema,
_sqlite: &dyn SqlConn,
_rows: &mut dyn RowSource,
) -> Result<QueryOutput> {
self.project_without_rows()
}
fn columns<'s>(&'s self) -> Box<dyn Iterator<Item = &'s Element> + 's> {
self.spec.columns()
}
}