use linkrs_core::types::Timestamp;
use linkrs_core::wal::types::{WalError, WalResult};
use super::sequential::LocalWalParser;
pub trait WalParser: Send + Sync {
fn open(&mut self, wal_uri: &str) -> WalResult<()>;
fn close(&mut self);
fn last_timestamp(&self) -> Timestamp;
}
pub struct WalParserFactory;
impl WalParserFactory {
pub fn create_wal_parser(wal_uri: &str) -> WalResult<Box<dyn WalParser>> {
let scheme = Self::get_scheme(wal_uri);
match scheme.as_str() {
"file" | "" => Ok(Box::new(LocalWalParser::new())),
_ => Err(WalError::IoError(format!(
"Unknown WAL parser scheme: {}",
scheme
))),
}
}
fn get_scheme(uri: &str) -> String {
if let Some(pos) = uri.find("://") {
uri[..pos].to_string()
} else {
"file".to_string()
}
}
}