use crate::default_token_factory::DefaultTokenFactory;
use crate::ZerobusResult;
use async_trait::async_trait;
use std::collections::HashMap;
#[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());
Ok(headers)
}
}