use crate::adbc::Database;
use crate::error::ConnectionError;
use std::str::FromStr;
#[derive(Debug, Clone)]
pub struct Driver {
name: String,
version: String,
vendor: String,
description: String,
}
impl Driver {
pub fn new() -> Self {
Self {
name: "exarrow-rs".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
vendor: "exarrow-rs contributors".to_string(),
description: "ADBC-compatible driver for Exasol with Arrow data format support"
.to_string(),
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn version(&self) -> &str {
&self.version
}
pub fn vendor(&self) -> &str {
&self.vendor
}
pub fn description(&self) -> &str {
&self.description
}
pub fn open(&self, connection_string: &str) -> Result<Database, ConnectionError> {
Database::from_str(connection_string)
}
pub fn validate_connection_string(&self, connection_string: &str) -> bool {
Database::from_str(connection_string).is_ok()
}
}
impl Default for Driver {
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Display for Driver {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} v{} ({})", self.name, self.version, self.vendor)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_driver_creation() {
let driver = Driver::new();
assert_eq!(driver.name(), "exarrow-rs");
assert_eq!(driver.vendor(), "exarrow-rs contributors");
assert!(!driver.version().is_empty());
assert!(!driver.description().is_empty());
}
#[test]
fn test_driver_default() {
let driver = Driver::default();
assert_eq!(driver.name(), "exarrow-rs");
}
#[test]
fn test_driver_display() {
let driver = Driver::new();
let display = format!("{}", driver);
assert!(display.contains("exarrow-rs"));
assert!(display.contains("contributors"));
}
#[test]
fn test_driver_open_valid() {
let driver = Driver::new();
let result = driver.open("exasol://user@localhost");
assert!(result.is_ok());
}
#[test]
fn test_driver_open_invalid() {
let driver = Driver::new();
let result = driver.open("invalid://connection");
assert!(result.is_err());
}
#[test]
fn test_validate_connection_string() {
let driver = Driver::new();
assert!(driver.validate_connection_string("exasol://user@localhost"));
assert!(driver.validate_connection_string("exasol://user:pass@host:8563"));
assert!(driver.validate_connection_string("exasol://user@host/schema"));
assert!(!driver.validate_connection_string(""));
assert!(!driver.validate_connection_string("invalid"));
assert!(!driver.validate_connection_string("postgres://user@host"));
}
}