use crate::default_token_factory::DefaultTokenFactory;
use crate::ZerobusResult;
use async_trait::async_trait;
use std::collections::HashMap;
pub const DEFAULT_X_ZEROBUS_SDK: &str = concat!("zerobus-sdk-rs/", env!("CARGO_PKG_VERSION"));
#[async_trait]
pub trait HeadersProvider: Send + Sync {
async fn get_headers(&self) -> ZerobusResult<HashMap<&'static str, String>>;
}
pub struct OAuthHeadersProvider {
client_id: String,
client_secret: String,
table_name: String,
workspace_id: String,
unity_catalog_url: String,
}
impl OAuthHeadersProvider {
pub fn new(
client_id: String,
client_secret: String,
table_name: String,
workspace_id: String,
unity_catalog_url: String,
) -> Self {
Self {
client_id,
client_secret,
table_name,
workspace_id,
unity_catalog_url,
}
}
}
#[async_trait]
impl HeadersProvider for OAuthHeadersProvider {
async fn get_headers(&self) -> ZerobusResult<HashMap<&'static str, String>> {
let token = DefaultTokenFactory::get_token(
&self.unity_catalog_url,
&self.table_name,
&self.client_id,
&self.client_secret,
&self.workspace_id,
)
.await?;
let mut headers = HashMap::new();
headers.insert("authorization", format!("Bearer {}", token));
headers.insert("x-databricks-zerobus-table-name", self.table_name.clone());
headers.insert("x-zerobus-sdk", DEFAULT_X_ZEROBUS_SDK.to_string());
Ok(headers)
}
}