1use std::collections::HashSet;
19use std::fmt::Display;
20use std::str::FromStr;
21
22use crate::Error;
23
24#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Default)]
32#[non_exhaustive]
33pub enum Scheme {
34 AliyunDrive,
36 Alluxio,
38 Azblob,
40 Azdls,
42 Azfile,
44 B2,
46 Cacache,
48 CloudflareKv,
50 Compfs,
52 Cos,
54 D1,
56 Dashmap,
58 Dbfs,
60 Dropbox,
62 Etcd,
64 Foundationdb,
66 Fs,
68 Ftp,
70 Gcs,
72 Gdrive,
74 Ghac,
76 Github,
78 Gridfs,
80 Hdfs,
82 HdfsNative,
84 Http,
86 Huggingface,
88 Ipfs,
90 Ipmfs,
92 Koofr,
94 Lakefs,
96 Memcached,
98 #[default]
100 Memory,
101 MiniMoka,
103 Moka,
105 Mongodb,
107 Monoiofs,
109 Mysql,
111 Obs,
113 Onedrive,
115 Oss,
117 Pcloud,
119 Persy,
121 Postgresql,
123 Redb,
125 Redis,
127 Rocksdb,
129 S3,
131 Seafile,
133 Sftp,
135 Sled,
137 Sqlite,
139 Surrealdb,
141 Swift,
143 Tikv,
145 Upyun,
147 VercelArtifacts,
149 VercelBlob,
151 Webdav,
153 Webhdfs,
155 YandexDisk,
157 Custom(&'static str),
164}
165
166impl Scheme {
167 pub fn into_static(self) -> &'static str {
169 self.into()
170 }
171
172 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 "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}