use crate::core::{Result, Row};
pub trait Scanner: Send {
fn next(&mut self) -> bool;
fn row(&self) -> &Row;
fn err(&self) -> Option<&crate::core::Error>;
fn close(&mut self) -> Result<()>;
fn take_row(&mut self) -> Row {
self.row().clone()
}
fn estimated_count(&self) -> Option<usize> {
None
}
fn take_row_with_id(&mut self) -> (i64, Row) {
(0, self.take_row())
}
fn current_row_id(&self) -> i64 {
0
}
}
pub struct EmptyScanner {
empty_row: Row,
closed: bool,
}
impl EmptyScanner {
pub fn new() -> Self {
Self {
empty_row: Row::new(),
closed: false,
}
}
}
impl Default for EmptyScanner {
fn default() -> Self {
Self::new()
}
}
impl Scanner for EmptyScanner {
fn next(&mut self) -> bool {
false
}
fn row(&self) -> &Row {
&self.empty_row
}
fn err(&self) -> Option<&crate::core::Error> {
None
}
fn close(&mut self) -> Result<()> {
self.closed = true;
Ok(())
}
fn estimated_count(&self) -> Option<usize> {
Some(0)
}
}
pub struct VecScanner {
rows: Vec<Row>,
current_index: Option<usize>,
error: Option<crate::core::Error>,
closed: bool,
}
impl VecScanner {
pub fn new(rows: Vec<Row>) -> Self {
Self {
rows,
current_index: None,
error: None,
closed: false,
}
}
pub fn with_error(error: crate::core::Error) -> Self {
Self {
rows: Vec::new(),
current_index: None,
error: Some(error),
closed: false,
}
}
}
impl Scanner for VecScanner {
fn next(&mut self) -> bool {
if self.closed || self.error.is_some() {
return false;
}
let next_index = match self.current_index {
None => 0,
Some(i) => i + 1,
};
if next_index < self.rows.len() {
self.current_index = Some(next_index);
true
} else {
false
}
}
fn row(&self) -> &Row {
match self.current_index {
Some(i) if i < self.rows.len() => &self.rows[i],
_ => {
panic!("row() called without successful next()")
}
}
}
fn err(&self) -> Option<&crate::core::Error> {
self.error.as_ref()
}
fn close(&mut self) -> Result<()> {
self.closed = true;
Ok(())
}
fn estimated_count(&self) -> Option<usize> {
Some(self.rows.len())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::Value;
#[test]
fn test_empty_scanner() {
let mut scanner = EmptyScanner::new();
assert!(!scanner.next());
assert!(scanner.err().is_none());
assert!(scanner.close().is_ok());
}
#[test]
fn test_vec_scanner_empty() {
let mut scanner = VecScanner::new(vec![]);
assert!(!scanner.next());
assert!(scanner.err().is_none());
}
#[test]
fn test_vec_scanner_with_rows() {
let rows = vec![
Row::from_values(vec![Value::Integer(1), Value::text("a")]),
Row::from_values(vec![Value::Integer(2), Value::text("b")]),
Row::from_values(vec![Value::Integer(3), Value::text("c")]),
];
let mut scanner = VecScanner::new(rows);
assert!(scanner.next());
assert_eq!(scanner.row().get(0), Some(&Value::Integer(1)));
assert!(scanner.next());
assert_eq!(scanner.row().get(0), Some(&Value::Integer(2)));
assert!(scanner.next());
assert_eq!(scanner.row().get(0), Some(&Value::Integer(3)));
assert!(!scanner.next());
assert!(scanner.err().is_none());
}
#[test]
fn test_vec_scanner_with_error() {
let mut scanner = VecScanner::with_error(crate::core::Error::internal("test error"));
assert!(!scanner.next());
assert!(scanner.err().is_some());
}
#[test]
fn test_vec_scanner_close() {
let rows = vec![Row::from_values(vec![Value::Integer(1)])];
let mut scanner = VecScanner::new(rows);
assert!(scanner.next());
assert!(scanner.close().is_ok());
assert!(!scanner.next());
}
}