opendal/types/
scheme.rs

1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements.  See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership.  The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License.  You may obtain a copy of the License at
8//
9//   http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied.  See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18use std::collections::HashSet;
19use std::fmt::Display;
20use std::str::FromStr;
21
22use crate::Error;
23
24/// Services that OpenDAL supports
25///
26/// # Notes
27///
28/// - Scheme is `non_exhaustive`, new variant COULD be added at any time.
29/// - New variant SHOULD be added in alphabet orders,
30/// - Users MUST NOT relay on its order.
31#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Default)]
32#[non_exhaustive]
33pub enum Scheme {
34    /// [aliyun-drive][crate::services::AliyunDrive]: Aliyun Drive services.
35    AliyunDrive,
36    /// [alluxio][crate::services::Alluxio]: Alluxio services.
37    Alluxio,
38    /// [azblob][crate::services::Azblob]: Azure Storage Blob services.
39    Azblob,
40    /// [Azdls][crate::services::Azdls]: Azure Data Lake Storage Gen2.
41    Azdls,
42    /// [azfile][crate::services::Azfile]: Azfile Services
43    Azfile,
44    /// [B2][crate::services::B2]: Backblaze B2 Services.
45    B2,
46    /// [cacache][crate::services::Cacache]: cacache backend support.
47    Cacache,
48    /// [cloudflare-kv][crate::services::CloudflareKv]: Cloudflare KV services.
49    CloudflareKv,
50    /// [Compfs][crate::services::Compfs]: Compio fs Services.
51    Compfs,
52    /// [cos][crate::services::Cos]: Tencent Cloud Object Storage services.
53    Cos,
54    /// [d1][crate::services::D1]: D1 services
55    D1,
56    /// [dashmap][crate::services::Dashmap]: dashmap backend support.
57    Dashmap,
58    /// [dbfs][crate::services::Dbfs]: DBFS backend support.
59    Dbfs,
60    /// [dropbox][crate::services::Dropbox]: Dropbox services.
61    Dropbox,
62    /// [etcd][crate::services::Etcd]: Etcd Services
63    Etcd,
64    /// [foundationdb][crate::services::Foundationdb]: Foundationdb services.
65    Foundationdb,
66    /// [fs][crate::services::Fs]: POSIX-like file system.
67    Fs,
68    /// [ftp][crate::services::Ftp]: FTP backend.
69    Ftp,
70    /// [gcs][crate::services::Gcs]: Google Cloud Storage backend.
71    Gcs,
72    /// [gdrive][crate::services::Gdrive]: GoogleDrive services.
73    Gdrive,
74    /// [ghac][crate::services::Ghac]: GitHub Action Cache services.
75    Ghac,
76    /// [Github Contents][crate::services::Github]: Github contents support.
77    Github,
78    /// [gridfs](crate::services::Gridfs): MongoDB Gridfs Services
79    Gridfs,
80    /// [hdfs][crate::services::Hdfs]: Hadoop Distributed File System.
81    Hdfs,
82    /// [Native HDFS](crate::services::HdfsNative): Hdfs Native service, using rust hdfs-native client for hdfs
83    HdfsNative,
84    /// [http][crate::services::Http]: HTTP backend.
85    Http,
86    /// [huggingface][crate::services::Huggingface]: Huggingface services.
87    Huggingface,
88    /// [ipmfs][crate::services::Ipfs]: IPFS HTTP Gateway
89    Ipfs,
90    /// [ipmfs][crate::services::Ipmfs]: IPFS mutable file system
91    Ipmfs,
92    /// [Koofr][crate::services::Koofr]: Koofr Services.
93    Koofr,
94    /// [lakefs](crate::services::Lakefs): LakeFS Services
95    Lakefs,
96    /// [memcached][crate::services::Memcached]: Memcached service support.
97    Memcached,
98    /// [memory][crate::services::Memory]: In memory backend support.
99    #[default]
100    Memory,
101    /// [mini-moka][crate::services::MiniMoka]: Mini Moka backend support.
102    MiniMoka,
103    /// [moka][crate::services::Moka]: moka backend support.
104    Moka,
105    /// [mongodb](crate::services::Mongodb): MongoDB Services
106    Mongodb,
107    /// [monoiofs][crate::services::Monoiofs]: monoio fs services.
108    Monoiofs,
109    /// [mysql][crate::services::Mysql]: Mysql services
110    Mysql,
111    /// [obs][crate::services::Obs]: Huawei Cloud OBS services.
112    Obs,
113    /// [onedrive][crate::services::Onedrive]: Microsoft OneDrive services.
114    Onedrive,
115    /// [oss][crate::services::Oss]: Aliyun Object Storage Services
116    Oss,
117    /// [Pcloud][crate::services::Pcloud]: Pcloud Services.
118    Pcloud,
119    /// [persy][crate::services::Persy]: persy backend support.
120    Persy,
121    /// [postgresql][crate::services::Postgresql]: Postgresql services
122    Postgresql,
123    /// [redb][crate::services::Redb]: Redb Services
124    Redb,
125    /// [redis][crate::services::Redis]: Redis services
126    Redis,
127    /// [rocksdb][crate::services::Rocksdb]: RocksDB services
128    Rocksdb,
129    /// [s3][crate::services::S3]: AWS S3 alike services.
130    S3,
131    /// [Seafile][crate::services::Seafile]: Seafile Services.
132    Seafile,
133    /// [sftp][crate::services::Sftp]: SFTP services
134    Sftp,
135    /// [sled][crate::services::Sled]: Sled services
136    Sled,
137    /// [sqlite][crate::services::Sqlite]: Sqlite services
138    Sqlite,
139    /// [surrealdb](crate::services::Surrealdb): Surrealdb Services
140    Surrealdb,
141    /// [swift][crate::services::Swift]: Swift backend support.
142    Swift,
143    /// [tikv][crate::services::Tikv]: Tikv Services
144    Tikv,
145    /// [Upyun][crate::services::Upyun]: Upyun Services.
146    Upyun,
147    /// [Vercel Artifacts][crate::services::VercelArtifacts]: Vercel Artifacts service, as known as Vercel Remote Caching.
148    VercelArtifacts,
149    /// [VercelBlob][crate::services::VercelBlob]: VercelBlob Services.
150    VercelBlob,
151    /// [webdav][crate::services::Webdav]: WebDAV support.
152    Webdav,
153    /// [webhdfs][crate::services::Webhdfs]: WebHDFS RESTful API Services
154    Webhdfs,
155    /// [YandexDisk][crate::services::YandexDisk]: YandexDisk Services.
156    YandexDisk,
157    /// Custom that allow users to implement services outside OpenDAL.
158    ///
159    /// # NOTE
160    ///
161    /// - Custom must not overwrite any existing services name.
162    /// - Custom must be in lower case.
163    Custom(&'static str),
164}
165
166impl Scheme {
167    /// Convert self into static str.
168    pub fn into_static(self) -> &'static str {
169        self.into()
170    }
171
172    /// Get all enabled schemes.
173    ///
174    /// OpenDAL could be compiled with different features, which will enable different schemes.
175    /// This function returns all enabled schemes so users can make decisions based on it.
176    ///
177    /// # Examples
178    ///
179    /// ```rust,no_run
180    /// use opendal::Scheme;
181    ///
182    /// let enabled_schemes = Scheme::enabled();
183    /// if !enabled_schemes.contains(&Scheme::Memory) {
184    ///     panic!("s3 support is not enabled")
185    /// }
186    /// ```
187    pub fn enabled() -> HashSet<Scheme> {
188        HashSet::from([
189            #[cfg(feature = "services-aliyun-drive")]
190            Scheme::AliyunDrive,
191            #[cfg(feature = "services-alluxio")]
192            Scheme::Alluxio,
193            #[cfg(feature = "services-azblob")]
194            Scheme::Azblob,
195            #[cfg(feature = "services-azdls")]
196            Scheme::Azdls,
197            #[cfg(feature = "services-azfile")]
198            Scheme::Azfile,
199            #[cfg(feature = "services-b2")]
200            Scheme::B2,
201            #[cfg(feature = "services-cacache")]
202            Scheme::Cacache,
203            #[cfg(feature = "services-cloudflare-kv")]
204            Scheme::CloudflareKv,
205            #[cfg(feature = "services-compfs")]
206            Scheme::Compfs,
207            #[cfg(feature = "services-cos")]
208            Scheme::Cos,
209            #[cfg(feature = "services-d1")]
210            Scheme::D1,
211            #[cfg(feature = "services-dashmap")]
212            Scheme::Dashmap,
213            #[cfg(feature = "services-dbfs")]
214            Scheme::Dbfs,
215            #[cfg(feature = "services-dropbox")]
216            Scheme::Dropbox,
217            #[cfg(feature = "services-etcd")]
218            Scheme::Etcd,
219            #[cfg(feature = "services-foundationdb")]
220            Scheme::Foundationdb,
221            #[cfg(feature = "services-fs")]
222            Scheme::Fs,
223            #[cfg(feature = "services-ftp")]
224            Scheme::Ftp,
225            #[cfg(feature = "services-gcs")]
226            Scheme::Gcs,
227            #[cfg(feature = "services-gdrive")]
228            Scheme::Gdrive,
229            #[cfg(feature = "services-ghac")]
230            Scheme::Ghac,
231            #[cfg(feature = "services-github")]
232            Scheme::Github,
233            #[cfg(feature = "services-gridfs")]
234            Scheme::Gridfs,
235            #[cfg(feature = "services-hdfs")]
236            Scheme::Hdfs,
237            #[cfg(feature = "services-hdfs-native")]
238            Scheme::HdfsNative,
239            #[cfg(feature = "services-http")]
240            Scheme::Http,
241            #[cfg(feature = "services-huggingface")]
242            Scheme::Huggingface,
243            #[cfg(feature = "services-ipfs")]
244            Scheme::Ipfs,
245            #[cfg(feature = "services-ipmfs")]
246            Scheme::Ipmfs,
247            #[cfg(feature = "services-koofr")]
248            Scheme::Koofr,
249            #[cfg(feature = "services-lakefs")]
250            Scheme::Lakefs,
251            #[cfg(feature = "services-memcached")]
252            Scheme::Memcached,
253            #[cfg(feature = "services-memory")]
254            Scheme::Memory,
255            #[cfg(feature = "services-mini-moka")]
256            Scheme::MiniMoka,
257            #[cfg(feature = "services-moka")]
258            Scheme::Moka,
259            #[cfg(feature = "services-mongodb")]
260            Scheme::Mongodb,
261            #[cfg(feature = "services-monoiofs")]
262            Scheme::Monoiofs,
263            #[cfg(feature = "services-mysql")]
264            Scheme::Mysql,
265            #[cfg(feature = "services-obs")]
266            Scheme::Obs,
267            #[cfg(feature = "services-onedrive")]
268            Scheme::Onedrive,
269            #[cfg(feature = "services-oss")]
270            Scheme::Oss,
271            #[cfg(feature = "services-pcloud")]
272            Scheme::Pcloud,
273            #[cfg(feature = "services-persy")]
274            Scheme::Persy,
275            #[cfg(feature = "services-postgresql")]
276            Scheme::Postgresql,
277            #[cfg(feature = "services-redb")]
278            Scheme::Redb,
279            #[cfg(feature = "services-redis")]
280            Scheme::Redis,
281            #[cfg(feature = "services-rocksdb")]
282            Scheme::Rocksdb,
283            #[cfg(feature = "services-s3")]
284            Scheme::S3,
285            #[cfg(feature = "services-seafile")]
286            Scheme::Seafile,
287            #[cfg(feature = "services-sftp")]
288            Scheme::Sftp,
289            #[cfg(feature = "services-sled")]
290            Scheme::Sled,
291            #[cfg(feature = "services-sqlite")]
292            Scheme::Sqlite,
293            #[cfg(feature = "services-surrealdb")]
294            Scheme::Surrealdb,
295            #[cfg(feature = "services-swift")]
296            Scheme::Swift,
297            #[cfg(feature = "services-tikv")]
298            Scheme::Tikv,
299            #[cfg(feature = "services-upyun")]
300            Scheme::Upyun,
301            #[cfg(feature = "services-vercel-artifacts")]
302            Scheme::VercelArtifacts,
303            #[cfg(feature = "services-vercel-blob")]
304            Scheme::VercelBlob,
305            #[cfg(feature = "services-webdav")]
306            Scheme::Webdav,
307            #[cfg(feature = "services-webhdfs")]
308            Scheme::Webhdfs,
309            #[cfg(feature = "services-yandex-disk")]
310            Scheme::YandexDisk,
311        ])
312    }
313}
314
315impl Display for Scheme {
316    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
317        f.write_str(self.into_static())
318    }
319}
320
321impl AsRef<str> for Scheme {
322    fn as_ref(&self) -> &str {
323        self.into_static()
324    }
325}
326
327impl FromStr for Scheme {
328    type Err = Error;
329
330    fn from_str(s: &str) -> Result<Self, Self::Err> {
331        let s = s.to_lowercase();
332        match s.as_str() {
333            "aliyun-drive" | "aliyun_drive" => Ok(Scheme::AliyunDrive),
334            "alluxio" => Ok(Scheme::Alluxio),
335            "azblob" => Ok(Scheme::Azblob),
336            // Notes:
337            //
338            // OpenDAL used to call `azdls` as `azdfs`, we keep it for backward compatibility.
339            // And abfs is widely used in hadoop ecosystem, keep it for easy to use.
340            "azdls" | "azdfs" | "abfs" => Ok(Scheme::Azdls),
341            "azfile" => Ok(Scheme::Azfile),
342            "b2" => Ok(Scheme::B2),
343            "cacache" => Ok(Scheme::Cacache),
344            "cloudflare-kv" | "cloudflare_kv" => Ok(Scheme::CloudflareKv),
345            "compfs" => Ok(Scheme::Compfs),
346            "cos" => Ok(Scheme::Cos),
347            "d1" => Ok(Scheme::D1),
348            "dashmap" => Ok(Scheme::Dashmap),
349            "dbfs" => Ok(Scheme::Dbfs),
350            "dropbox" => Ok(Scheme::Dropbox),
351            "etcd" => Ok(Scheme::Etcd),
352            "foundationdb" => Ok(Scheme::Foundationdb),
353            "fs" => Ok(Scheme::Fs),
354            "ftp" | "ftps" => Ok(Scheme::Ftp),
355            "gcs" => Ok(Scheme::Gcs),
356            "gdrive" => Ok(Scheme::Gdrive),
357            "ghac" => Ok(Scheme::Ghac),
358            "github" => Ok(Scheme::Github),
359            "gridfs" => Ok(Scheme::Gridfs),
360            "hdfs" => Ok(Scheme::Hdfs),
361            "hdfs-native" | "hdfs_native" => Ok(Scheme::HdfsNative),
362            "http" | "https" => Ok(Scheme::Http),
363            "huggingface" | "hf" => Ok(Scheme::Huggingface),
364            "ipfs" | "ipns" => Ok(Scheme::Ipfs),
365            "ipmfs" => Ok(Scheme::Ipmfs),
366            "koofr" => Ok(Scheme::Koofr),
367            "lakefs" => Ok(Scheme::Lakefs),
368            "memcached" => Ok(Scheme::Memcached),
369            "memory" => Ok(Scheme::Memory),
370            "mini-moka" | "mini_moka" => Ok(Scheme::MiniMoka),
371            "moka" => Ok(Scheme::Moka),
372            "mongodb" => Ok(Scheme::Mongodb),
373            "monoiofs" => Ok(Scheme::Monoiofs),
374            "mysql" => Ok(Scheme::Mysql),
375            "obs" => Ok(Scheme::Obs),
376            "onedrive" => Ok(Scheme::Onedrive),
377            "oss" => Ok(Scheme::Oss),
378            "pcloud" => Ok(Scheme::Pcloud),
379            "persy" => Ok(Scheme::Persy),
380            "postgresql" => Ok(Scheme::Postgresql),
381            "redb" => Ok(Scheme::Redb),
382            "redis" => Ok(Scheme::Redis),
383            "rocksdb" => Ok(Scheme::Rocksdb),
384            "s3" => Ok(Scheme::S3),
385            "seafile" => Ok(Scheme::Seafile),
386            "sftp" => Ok(Scheme::Sftp),
387            "sled" => Ok(Scheme::Sled),
388            "sqlite" => Ok(Scheme::Sqlite),
389            "surrealdb" => Ok(Scheme::Surrealdb),
390            "swift" => Ok(Scheme::Swift),
391            "tikv" => Ok(Scheme::Tikv),
392            "upyun" => Ok(Scheme::Upyun),
393            "vercel-artifacts" | "vercel_artifacts" => Ok(Scheme::VercelArtifacts),
394            "vercel-blob" | "vercel_blob" => Ok(Scheme::VercelBlob),
395            "webdav" => Ok(Scheme::Webdav),
396            "webhdfs" => Ok(Scheme::Webhdfs),
397            "yandex-disk" | "yandex_disk" => Ok(Scheme::YandexDisk),
398            _ => Ok(Scheme::Custom(Box::leak(s.into_boxed_str()))),
399        }
400    }
401}
402
403impl From<Scheme> for &'static str {
404    fn from(v: Scheme) -> Self {
405        match v {
406            Scheme::AliyunDrive => "aliyun-drive",
407            Scheme::Alluxio => "alluxio",
408            Scheme::Azblob => "azblob",
409            Scheme::Azdls => "azdls",
410            Scheme::Azfile => "azfile",
411            Scheme::B2 => "b2",
412            Scheme::Cacache => "cacache",
413            Scheme::CloudflareKv => "cloudflare-kv",
414            Scheme::Compfs => "compfs",
415            Scheme::Cos => "cos",
416            Scheme::D1 => "d1",
417            Scheme::Dashmap => "dashmap",
418            Scheme::Dbfs => "dbfs",
419            Scheme::Dropbox => "dropbox",
420            Scheme::Etcd => "etcd",
421            Scheme::Foundationdb => "foundationdb",
422            Scheme::Fs => "fs",
423            Scheme::Ftp => "ftp",
424            Scheme::Gcs => "gcs",
425            Scheme::Gdrive => "gdrive",
426            Scheme::Ghac => "ghac",
427            Scheme::Github => "github",
428            Scheme::Gridfs => "gridfs",
429            Scheme::Hdfs => "hdfs",
430            Scheme::HdfsNative => "hdfs-native",
431            Scheme::Http => "http",
432            Scheme::Huggingface => "huggingface",
433            Scheme::Ipfs => "ipfs",
434            Scheme::Ipmfs => "ipmfs",
435            Scheme::Koofr => "koofr",
436            Scheme::Lakefs => "lakefs",
437            Scheme::Memcached => "memcached",
438            Scheme::Memory => "memory",
439            Scheme::MiniMoka => "mini-moka",
440            Scheme::Moka => "moka",
441            Scheme::Mongodb => "mongodb",
442            Scheme::Monoiofs => "monoiofs",
443            Scheme::Mysql => "mysql",
444            Scheme::Obs => "obs",
445            Scheme::Onedrive => "onedrive",
446            Scheme::Oss => "oss",
447            Scheme::Pcloud => "pcloud",
448            Scheme::Persy => "persy",
449            Scheme::Postgresql => "postgresql",
450            Scheme::Redb => "redb",
451            Scheme::Redis => "redis",
452            Scheme::Rocksdb => "rocksdb",
453            Scheme::S3 => "s3",
454            Scheme::Seafile => "seafile",
455            Scheme::Sftp => "sftp",
456            Scheme::Sled => "sled",
457            Scheme::Sqlite => "sqlite",
458            Scheme::Surrealdb => "surrealdb",
459            Scheme::Swift => "swift",
460            Scheme::Tikv => "tikv",
461            Scheme::Upyun => "upyun",
462            Scheme::VercelArtifacts => "vercel-artifacts",
463            Scheme::VercelBlob => "vercel-blob",
464            Scheme::Webdav => "webdav",
465            Scheme::Webhdfs => "webhdfs",
466            Scheme::YandexDisk => "yandex-disk",
467            Scheme::Custom(v) => v,
468        }
469    }
470}
471
472impl From<Scheme> for String {
473    fn from(v: Scheme) -> Self {
474        v.into_static().to_string()
475    }
476}