use crate::{config, config::Layer, Opendal, OpendalResult};
use opendal::{Configurator, Operator};
impl Opendal {
#[allow(unused_variables)]
pub fn try_from_config(config: config::Opendal) -> OpendalResult<Self> {
#[allow(unused_mut)]
let mut opendal = Self::default();
#[cfg(feature = "services-aliyun-drive")]
{
opendal = opendal.register(config.services.aliyun_drive, &config.layers)?;
}
#[cfg(feature = "services-atomicserver")]
{
opendal = opendal.register(config.services.atomicserver, &config.layers)?;
}
#[cfg(feature = "services-azblob")]
{
opendal = opendal.register(config.services.azblob, &config.layers)?;
}
#[cfg(feature = "services-azdls")]
{
opendal = opendal.register(config.services.azdls, &config.layers)?;
}
#[cfg(feature = "services-b2")]
{
opendal = opendal.register(config.services.b2, &config.layers)?;
}
#[cfg(feature = "services-chainsafe")]
{
opendal = opendal.register(config.services.chainsafe, &config.layers)?;
}
#[cfg(feature = "services-cacache")]
{
opendal = opendal.register(config.services.cacache, &config.layers)?;
}
#[cfg(feature = "services-compfs")]
{
opendal = opendal.register(config.services.compfs, &config.layers)?;
}
#[cfg(feature = "services-cloudflare-kv")]
{
opendal = opendal.register(config.services.cloudflare_kv, &config.layers)?;
}
#[cfg(feature = "services-cos")]
{
opendal = opendal.register(config.services.cos, &config.layers)?;
}
#[cfg(feature = "services-d1")]
{
opendal = opendal.register(config.services.d1, &config.layers)?;
}
#[cfg(feature = "services-dashmap")]
{
opendal = opendal.register(config.services.dashmap, &config.layers)?;
}
#[cfg(feature = "services-dbfs")]
{
opendal = opendal.register(config.services.dbfs, &config.layers)?;
}
#[cfg(feature = "services-dropbox")]
{
opendal = opendal.register(config.services.dropbox, &config.layers)?;
}
#[cfg(feature = "services-etcd")]
{
opendal = opendal.register(config.services.etcd, &config.layers)?;
}
#[cfg(feature = "services-fs")]
{
opendal = opendal.register(config.services.fs, &config.layers)?;
}
#[cfg(feature = "services-gcs")]
{
opendal = opendal.register(config.services.gcs, &config.layers)?;
}
#[cfg(feature = "services-gdrive")]
{
opendal = opendal.register(config.services.gdrive, &config.layers)?;
}
#[cfg(feature = "services-ghac")]
{
opendal = opendal.register(config.services.ghac, &config.layers)?;
}
#[cfg(feature = "services-gridfs")]
{
opendal = opendal.register(config.services.gridfs, &config.layers)?;
}
#[cfg(feature = "services-github")]
{
opendal = opendal.register(config.services.github, &config.layers)?;
}
#[cfg(feature = "services-http")]
{
opendal = opendal.register(config.services.http, &config.layers)?;
}
#[cfg(feature = "services-huggingface")]
{
opendal = opendal.register(config.services.huggingface, &config.layers)?;
}
#[cfg(feature = "services-ipfs")]
{
opendal = opendal.register(config.services.ipfs, &config.layers)?;
}
#[cfg(feature = "services-ipmfs")]
{
opendal = opendal.register(config.services.ipmfs, &config.layers)?;
}
#[cfg(feature = "services-icloud")]
{
opendal = opendal.register(config.services.icloud, &config.layers)?;
}
#[cfg(feature = "services-koofr")]
{
opendal = opendal.register(config.services.koofr, &config.layers)?;
}
#[cfg(feature = "services-libsql")]
{
opendal = opendal.register(config.services.libsql, &config.layers)?;
}
#[cfg(feature = "services-memcached")]
{
opendal = opendal.register(config.services.memcached, &config.layers)?;
}
#[cfg(feature = "services-memory")]
{
opendal = opendal.register(config.services.memory, &config.layers)?;
}
#[cfg(feature = "services-mysql")]
{
opendal = opendal.register(config.services.mysql, &config.layers)?;
}
#[cfg(feature = "services-sqlite")]
{
opendal = opendal.register(config.services.sqlite, &config.layers)?;
}
#[cfg(feature = "services-mini-moka")]
{
opendal = opendal.register(config.services.mini_moka, &config.layers)?;
}
#[cfg(feature = "services-moka")]
{
opendal = opendal.register(config.services.moka, &config.layers)?;
}
#[cfg(feature = "services-monoiofs")]
{
opendal = opendal.register(config.services.monoiofs, &config.layers)?;
}
#[cfg(feature = "services-obs")]
{
opendal = opendal.register(config.services.obs, &config.layers)?;
}
#[cfg(feature = "services-onedrive")]
{
opendal = opendal.register(config.services.onedrive, &config.layers)?;
}
#[cfg(feature = "services-persy")]
{
opendal = opendal.register(config.services.persy, &config.layers)?;
}
#[cfg(feature = "services-postgresql")]
{
opendal = opendal.register(config.services.postgresql, &config.layers)?;
}
#[cfg(feature = "services-redb")]
{
opendal = opendal.register(config.services.redb, &config.layers)?;
}
#[cfg(feature = "services-redis")]
{
opendal = opendal.register(config.services.redis, &config.layers)?;
}
#[cfg(feature = "services-s3")]
{
opendal = opendal.register(config.services.s3, &config.layers)?;
}
#[cfg(feature = "services-seafile")]
{
opendal = opendal.register(config.services.seafile, &config.layers)?;
}
#[cfg(feature = "services-upyun")]
{
opendal = opendal.register(config.services.upyun, &config.layers)?;
}
#[cfg(feature = "services-yandex-disk")]
{
opendal = opendal.register(config.services.yandex_disk, &config.layers)?;
}
#[cfg(feature = "services-sftp")]
{
opendal = opendal.register(config.services.sftp, &config.layers)?;
}
#[cfg(feature = "services-sled")]
{
opendal = opendal.register(config.services.sled, &config.layers)?;
}
#[cfg(feature = "services-supabase")]
{
opendal = opendal.register(config.services.supabase, &config.layers)?;
}
#[cfg(feature = "services-swift")]
{
opendal = opendal.register(config.services.swift, &config.layers)?;
}
#[cfg(feature = "services-oss")]
{
opendal = opendal.register(config.services.oss, &config.layers)?;
}
#[cfg(feature = "services-vercel-artifacts")]
{
opendal = opendal.register(config.services.vercel_artifacts, &config.layers)?;
}
#[cfg(feature = "services-vercel-blob")]
{
opendal = opendal.register(config.services.vercel_blob, &config.layers)?;
}
#[cfg(feature = "services-webdav")]
{
opendal = opendal.register(config.services.webdav, &config.layers)?;
}
#[cfg(feature = "services-webhdfs")]
{
opendal = opendal.register(config.services.webhdfs, &config.layers)?;
}
#[cfg(feature = "services-tikv")]
{
opendal = opendal.register(config.services.tikv, &config.layers)?;
}
#[cfg(feature = "services-azfile")]
{
opendal = opendal.register(config.services.azfile, &config.layers)?;
}
#[cfg(feature = "services-mongodb")]
{
opendal = opendal.register(config.services.mongodb, &config.layers)?;
}
#[cfg(feature = "services-surrealdb")]
{
opendal = opendal.register(config.services.surrealdb, &config.layers)?;
}
#[cfg(feature = "services-lakefs")]
{
opendal = opendal.register(config.services.lakefs, &config.layers)?;
}
Ok(opendal)
}
pub fn register<C: Configurator>(mut self, cfg: C, layers: &Vec<Layer>) -> OpendalResult<Self> {
#[allow(unused_mut)]
let mut operator = Operator::from_config(cfg)?.finish();
for layer in layers {
match layer {
#[cfg(feature = "layers-async-backtrace")]
Layer::AsyncBacktrace => {
operator = operator.layer(opendal::layers::AsyncBacktraceLayer);
}
#[cfg(feature = "layers-await-tree")]
Layer::AwaitTree => {
operator = operator.layer(opendal::layers::AwaitTreeLayer::default());
}
#[cfg(feature = "layers-concurrent-limit")]
Layer::ConcurrentLimit { permits } => {
operator = operator.layer(opendal::layers::ConcurrentLimitLayer::new(*permits));
}
#[cfg(feature = "layers-chaos")]
Layer::Chaos { error_ratio } => {
operator = operator.layer(opendal::layers::ChaosLayer::new(*error_ratio));
}
#[cfg(all(target_os = "linux", feature = "layers-dtrace"))]
Layer::Dtrace => {
operator = operator.layer(opendal::layers::DtraceLayer::default());
}
#[cfg(feature = "layers-fastrace")]
Layer::Fastrace => {
operator = operator.layer(opendal::layers::FastraceLayer);
}
#[cfg(feature = "layers-immutable-index")]
Layer::ImmutableIndex => {
operator = operator.layer(opendal::layers::ImmutableIndexLayer::default());
}
#[cfg(feature = "layers-logging")]
Layer::Logging => {
operator = operator.layer(opendal::layers::LoggingLayer::default());
}
#[cfg(feature = "layers-metrics")]
Layer::Metrics => {
operator = operator.layer(opendal::layers::MetricsLayer::default());
}
#[cfg(feature = "layers-mime-guess")]
Layer::MimeGuess => {
operator = operator.layer(opendal::layers::MimeGuessLayer::default());
}
#[cfg(feature = "layers-otel-trace")]
Layer::OtelTrace => {
operator = operator.layer(opendal::layers::OtelTraceLayer);
}
#[cfg(feature = "layers-prometheus-client")]
Layer::PrometheusClient => {
let mut registry = prometheus_client::registry::Registry::default();
operator = operator.layer(
opendal::layers::PrometheusClientLayer::builder().register(&mut registry),
);
}
#[cfg(feature = "layers-prometheus")]
Layer::Prometheus => {
let registry = prometheus::default_registry();
operator = operator
.layer(opendal::layers::PrometheusLayer::builder().register(registry)?);
}
#[cfg(feature = "layers-timeout")]
Layer::Timeout {
timeout,
io_timeout,
} => {
operator = operator.layer(
opendal::layers::TimeoutLayer::new()
.with_timeout(std::time::Duration::from_millis(*timeout))
.with_io_timeout(std::time::Duration::from_millis(*io_timeout)),
);
}
#[cfg(feature = "layers-throttle")]
Layer::Throttle { bandwidth, burst } => {
operator =
operator.layer(opendal::layers::ThrottleLayer::new(*bandwidth, *burst));
}
#[cfg(feature = "layers-retry")]
Layer::Retry => {
operator = operator.layer(opendal::layers::RetryLayer::new());
}
#[cfg(feature = "layers-tracing")]
Layer::Tracing => {
operator = operator.layer(opendal::layers::TracingLayer);
}
#[allow(unreachable_patterns)]
_ => {} }
}
self.services
.insert(operator.info().scheme().to_string(), operator);
Ok(self)
}
pub fn operator(&self, name: &str) -> OpendalResult<&Operator> {
Ok(self.services.get(name).ok_or(opendal::Error::new(
opendal::ErrorKind::Unsupported,
format!("services-{name} is not enabled or supported"),
))?)
}
}