use std::result::Result as StdResult;
use std::sync::Arc;
use thiserror::Error;
use crate::driver::Record;
use crate::summary::Summary;
use crate::value::ValueReceive;
#[derive(Debug)]
pub struct EagerResult {
pub keys: Vec<Arc<String>>,
pub records: Vec<Record>,
pub summary: Summary,
}
impl EagerResult {
pub fn into_scalar(mut self) -> StdResult<ValueReceive, ScalarError> {
match self.records.len() {
0 => Err(ScalarError::NoRecord),
1 => match self.keys.len() {
0 => Err(ScalarError::NoValue),
1 => {
let record = self.records.pop().unwrap();
Ok(record.into_values().next().unwrap())
}
_ => Err(ScalarError::MoreThanOneRecord),
},
_ => Err(ScalarError::MoreThanOneRecord),
}
}
pub fn into_single(self) -> StdResult<Record, ScalarError> {
match self.records.len() {
0 => Err(ScalarError::NoRecord),
1 => Ok(self.records.into_iter().next().unwrap()),
_ => Err(ScalarError::MoreThanOneRecord),
}
}
pub fn into_values(self) -> impl Iterator<Item = impl Iterator<Item = ValueReceive>> {
self.records.into_iter().map(Record::into_values)
}
}
#[derive(Debug, Error)]
pub enum ScalarError {
#[error("expected exactly one record, but found none")]
NoRecord,
#[error("expected exactly one record, but found more")]
MoreThanOneRecord,
#[error("expected single record to have exactly one value, but found none")]
NoValue,
#[error("expected single record to have exactly one value, but found more")]
MoreThanOneValue,
}