use std::sync::Arc;
#[derive(Clone, PartialEq, Eq)]
pub struct R2Credentials {
pub endpoint_host: String,
pub region: String,
pub access_key_id: String,
pub secret_access_key: String,
}
impl R2Credentials {
pub fn for_account(
account_id: &str,
region: String,
access_key_id: String,
secret_access_key: String,
) -> Self {
Self {
endpoint_host: format!("{account_id}.r2.cloudflarestorage.com"),
region,
access_key_id,
secret_access_key,
}
}
}
#[derive(Clone, PartialEq, Eq)]
pub struct PublicStorageTarget {
pub credentials: R2Credentials,
pub bucket: String,
pub base_url: String,
}
pub trait ObjectStorageResolver: Send + Sync {
fn resolve(&self, project_id: &str) -> Option<Arc<R2Credentials>>;
}
pub trait PublicStorageResolver: Send + Sync {
fn resolve(&self, project_id: &str) -> Option<Arc<PublicStorageTarget>>;
}
pub struct StaticResolver<T> {
target: Arc<T>,
}
impl<T> StaticResolver<T> {
pub fn new(target: T) -> Self {
Self {
target: Arc::new(target),
}
}
}
impl ObjectStorageResolver for StaticResolver<R2Credentials> {
fn resolve(&self, _project_id: &str) -> Option<Arc<R2Credentials>> {
Some(self.target.clone())
}
}
impl PublicStorageResolver for StaticResolver<PublicStorageTarget> {
fn resolve(&self, _project_id: &str) -> Option<Arc<PublicStorageTarget>> {
Some(self.target.clone())
}
}