use crate::ast::ParameterizedValue;
use std::{collections::BTreeMap, sync::Arc};
#[derive(Debug)]
pub struct ResultRow {
pub(crate) name_to_index: Arc<BTreeMap<String, usize>>,
pub(crate) values: Vec<ParameterizedValue<'static>>,
}
impl IntoIterator for ResultRow {
type Item = ParameterizedValue<'static>;
type IntoIter = std::vec::IntoIter<ParameterizedValue<'static>>;
fn into_iter(self) -> Self::IntoIter {
self.values.into_iter()
}
}
#[derive(Debug)]
pub struct ResultRowRef<'a> {
pub(crate) name_to_index: Arc<BTreeMap<String, usize>>,
pub(crate) values: &'a Vec<ParameterizedValue<'static>>,
}
impl ResultRow {
pub fn at(&self, i: usize) -> Option<&ParameterizedValue<'static>> {
if self.values.len() <= i {
None
} else {
Some(&self.values[i])
}
}
pub fn get(&self, name: &str) -> Option<&ParameterizedValue<'static>> {
if let Some(idx) = self.name_to_index.get(name) {
Some(&self.values[*idx])
} else {
None
}
}
pub fn as_ref(&self) -> ResultRowRef {
ResultRowRef {
name_to_index: Arc::clone(&self.name_to_index),
values: &self.values,
}
}
}
impl<'a> ResultRowRef<'a> {
pub fn at(&self, i: usize) -> Option<&ParameterizedValue<'static>> {
if self.values.len() <= i {
None
} else {
Some(&self.values[i])
}
}
pub fn get(&self, name: &str) -> Option<&ParameterizedValue<'static>> {
if let Some(idx) = self.name_to_index.get(name) {
Some(&self.values[*idx])
} else {
None
}
}
}