use adbc_core::{
error::{Error, Result},
options::AdbcVersion,
};
#[cfg(feature = "env")]
use crate::builder::env_parse;
use crate::Driver;
#[derive(Clone, Debug, Default)]
#[non_exhaustive]
pub struct Builder {
pub adbc_version: Option<AdbcVersion>,
}
#[cfg(feature = "env")]
impl Builder {
pub const ADBC_VERSION_ENV: &str = "ADBC_SNOWFLAKE_ADBC_VERSION";
pub fn from_env() -> Result<Self> {
#[cfg(feature = "dotenv")]
let _ = dotenvy::dotenv();
let adbc_version = env_parse(Self::ADBC_VERSION_ENV, str::parse)?;
Ok(Self { adbc_version })
}
}
impl Builder {
pub fn with_adbc_version(mut self, version: AdbcVersion) -> Self {
self.adbc_version = Some(version);
self
}
pub fn try_load(self) -> Result<Driver> {
Driver::try_new(self.adbc_version.unwrap_or_default())
}
}
impl TryFrom<Builder> for Driver {
type Error = Error;
fn try_from(value: Builder) -> Result<Self> {
value.try_load()
}
}
#[cfg(test)]
#[cfg(feature = "env")]
mod tests {
use std::env;
use adbc_core::error::Status;
use super::*;
#[test]
fn from_env_parse_error() {
env::set_var(Builder::ADBC_VERSION_ENV, "?");
let result = Builder::from_env();
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
Error::with_message_and_status("Unknown ADBC version: ?", Status::InvalidArguments)
);
}
}