use std::env;
use std::io::Result;
use opendal::services;
use opendal::Operator;
use opendal::Scheme;
pub static ABODE_ADDR: &str = "ABODE_ADDR";
pub static ABODE_BACKEND_TYPE: &str = "ABODE_BACKEND_TYPE";
pub fn get_abode_addr() -> String {
env::var(ABODE_ADDR).unwrap_or_else(|_| "127.0.0.1:8080".to_string())
}
pub fn get_abode_backend_type() -> Result<Scheme> {
Ok(env::var(ABODE_BACKEND_TYPE)
.unwrap_or_else(|_| "fs".to_string())
.parse()?)
}
pub async fn get_abode_operator() -> Result<Operator> {
let scheme = get_abode_backend_type()?;
let prefix = format!("abode_backend_{scheme}_");
let envs = env::vars().filter_map(move |(k, v)| {
k.to_lowercase()
.strip_prefix(&prefix)
.map(|k| (k.to_string(), v))
});
let op = match scheme {
Scheme::Azblob => Operator::from_iter::<services::Azblob>(envs)?.finish(),
Scheme::Azdfs => Operator::from_iter::<services::Azdfs>(envs)?.finish(),
Scheme::Fs => Operator::from_iter::<services::Fs>(envs)?.finish(),
Scheme::Gcs => Operator::from_iter::<services::Gcs>(envs)?.finish(),
Scheme::Ghac => Operator::from_iter::<services::Ghac>(envs)?.finish(),
Scheme::Http => Operator::from_iter::<services::Http>(envs)?.finish(),
Scheme::Ipmfs => Operator::from_iter::<services::Ipmfs>(envs)?.finish(),
Scheme::Memory => Operator::from_iter::<services::Memory>(envs)?.finish(),
Scheme::Obs => Operator::from_iter::<services::Obs>(envs)?.finish(),
Scheme::Oss => Operator::from_iter::<services::Oss>(envs)?.finish(),
Scheme::S3 => Operator::from_iter::<services::S3>(envs)?.finish(),
Scheme::Webdav => Operator::from_iter::<services::Webdav>(envs)?.finish(),
_ => unimplemented!("not supported services"),
};
Ok(op)
}