datasources 0.1.5

Async datasource interfaces, middleware, registry, and test doubles
Documentation
use crate::array_reader::ArrayReader;
use crate::datasource_error::DatasourceError;
use crate::reader::Reader;
use crate::result::Result;
use crate::row::Row;
use async_trait::async_trait;
use std::sync::Mutex;

pub struct MockReader<T = Row> {
    inner: ArrayReader<T>,
    error: Mutex<Option<String>>,
}

impl<T> MockReader<T> {
    pub fn new(rows: Vec<T>) -> Self {
        Self {
            inner: ArrayReader::new(rows),
            error: Mutex::new(None),
        }
    }

    pub fn set_error(&self, message: impl Into<String>) {
        *self.error.lock().expect("mock") = Some(message.into());
    }
}

#[async_trait]
impl<T> Reader<T> for MockReader<T>
where
    T: Clone + Send + Sync,
{
    fn current(&self) -> Option<T> {
        self.inner.current()
    }

    async fn next(&self) -> Result<bool> {
        if let Some(error) = &*self.error.lock().expect("mock") {
            return Err(DatasourceError::message(error.clone()));
        }
        self.inner.next().await
    }
}