use crate::ir::{Cell, Char};
pub trait VisionBackend: Send + Sync {
fn ocr_page(&self, page_png: &[u8], dpi: u32) -> Result<Vec<Char>, BackendError>;
fn detect_table(&self, region_png: &[u8]) -> Result<Vec<Vec<Cell>>, BackendError>;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct NoopBackend;
impl VisionBackend for NoopBackend {
fn ocr_page(&self, _page_png: &[u8], _dpi: u32) -> Result<Vec<Char>, BackendError> {
Err(BackendError::Unsupported)
}
fn detect_table(&self, _region_png: &[u8]) -> Result<Vec<Vec<Cell>>, BackendError> {
Err(BackendError::Unsupported)
}
}
#[derive(Debug, thiserror::Error)]
pub enum BackendError {
#[error("operation not supported by this backend")]
Unsupported,
#[error("backend failure: {0}")]
Failed(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn noop_backend_does_no_inference() {
let b = NoopBackend;
assert!(matches!(b.ocr_page(&[], 300), Err(BackendError::Unsupported)));
assert!(matches!(b.detect_table(&[]), Err(BackendError::Unsupported)));
}
}