use std::collections::HashMap;
use std::path::PathBuf;
#[derive(Clone, Debug, Default)]
pub struct SparklessConfig {
pub warehouse_dir: Option<PathBuf>,
pub temp_dir: Option<PathBuf>,
pub case_sensitive: bool,
pub extra: HashMap<String, String>,
}
impl SparklessConfig {
pub fn from_env() -> Self {
let warehouse_dir = std::env::var("ROBIN_SPARKLESS_WAREHOUSE_DIR")
.ok()
.filter(|s| !s.is_empty())
.map(PathBuf::from);
let temp_dir = std::env::var("ROBIN_SPARKLESS_TEMP_DIR")
.ok()
.filter(|s| !s.is_empty())
.map(PathBuf::from);
let case_sensitive = std::env::var("ROBIN_SPARKLESS_CASE_SENSITIVE")
.map(|v| v.eq_ignore_ascii_case("true") || v == "1")
.unwrap_or(false);
let prefix = "ROBIN_SPARKLESS_CONFIG_";
let mut extra = HashMap::new();
for (k, v) in std::env::vars() {
if let Some(suffix) = k.strip_prefix(prefix) {
let key = suffix.replace('_', ".");
if !key.is_empty() && !v.is_empty() {
extra.insert(key, v);
}
}
}
SparklessConfig {
warehouse_dir,
temp_dir,
case_sensitive,
extra,
}
}
pub fn to_session_config(&self) -> HashMap<String, String> {
let mut m = self.extra.clone();
if let Some(ref d) = self.warehouse_dir
&& let Some(s) = d.to_str()
{
m.insert("spark.sql.warehouse.dir".to_string(), s.to_string());
}
m.insert(
"spark.sql.caseSensitive".to_string(),
if self.case_sensitive { "true" } else { "false" }.to_string(),
);
m
}
}