1use std::collections::HashSet;
19use std::fmt::Display;
20use std::fmt::Formatter;
21use std::str::FromStr;
22
23use crate::Error;
24
25#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
33#[non_exhaustive]
34pub enum Scheme {
35 AliyunDrive,
37 Atomicserver,
39 Azblob,
41 Azdls,
43 B2,
45 Compfs,
47 Seafile,
49 Upyun,
51 VercelBlob,
53 YandexDisk,
55 Pcloud,
57 Koofr,
59 Cacache,
61 CloudflareKv,
63 Cos,
65 D1,
67 Dashmap,
69 Etcd,
71 Foundationdb,
73 Dbfs,
75 Fs,
77 Ftp,
79 Gcs,
81 Ghac,
83 Hdfs,
85 Http,
87 Huggingface,
89 Alluxio,
91
92 Ipfs,
94 Ipmfs,
96 Icloud,
98 Memcached,
100 Memory,
102 MiniMoka,
104 Moka,
106 Monoiofs,
108 Obs,
110 Onedrive,
112 Gdrive,
114 Dropbox,
116 Oss,
118 Persy,
120 Redis,
122 Postgresql,
124 Mysql,
126 Sqlite,
128 Rocksdb,
130 S3,
132 Sftp,
134 Sled,
136 Swift,
138 VercelArtifacts,
140 Webdav,
142 Webhdfs,
144 Redb,
146 Tikv,
148 Azfile,
150 Mongodb,
152 Gridfs,
154 Github,
156 HdfsNative,
158 Surrealdb,
160 Lakefs,
162 NebulaGraph,
164 Custom(&'static str),
171}
172
173impl Scheme {
174 pub fn into_static(self) -> &'static str {
176 self.into()
177 }
178
179 pub fn enabled() -> HashSet<Scheme> {
195 HashSet::from([
196 #[cfg(feature = "services-aliyun-drive")]
197 Scheme::AliyunDrive,
198 #[cfg(feature = "services-alluxio")]
199 Scheme::Alluxio,
200 #[cfg(feature = "services-azblob")]
201 Scheme::Azblob,
202 #[cfg(feature = "services-azdls")]
203 Scheme::Azdls,
204 #[cfg(feature = "services-azfile")]
205 Scheme::Azfile,
206 #[cfg(feature = "services-b2")]
207 Scheme::B2,
208 #[cfg(feature = "services-cacache")]
209 Scheme::Cacache,
210 #[cfg(feature = "services-cos")]
211 Scheme::Cos,
212 #[cfg(feature = "services-compfs")]
213 Scheme::Compfs,
214 #[cfg(feature = "services-dashmap")]
215 Scheme::Dashmap,
216 #[cfg(feature = "services-dropbox")]
217 Scheme::Dropbox,
218 #[cfg(feature = "services-etcd")]
219 Scheme::Etcd,
220 #[cfg(feature = "services-foundationdb")]
221 Scheme::Foundationdb,
222 #[cfg(feature = "services-fs")]
223 Scheme::Fs,
224 #[cfg(feature = "services-ftp")]
225 Scheme::Ftp,
226 #[cfg(feature = "services-gcs")]
227 Scheme::Gcs,
228 #[cfg(feature = "services-ghac")]
229 Scheme::Ghac,
230 #[cfg(feature = "services-hdfs")]
231 Scheme::Hdfs,
232 #[cfg(feature = "services-http")]
233 Scheme::Http,
234 #[cfg(feature = "services-huggingface")]
235 Scheme::Huggingface,
236 #[cfg(feature = "services-ipfs")]
237 Scheme::Ipfs,
238 #[cfg(feature = "services-ipmfs")]
239 Scheme::Ipmfs,
240 #[cfg(feature = "services-memcached")]
241 Scheme::Memcached,
242 #[cfg(feature = "services-memory")]
243 Scheme::Memory,
244 #[cfg(feature = "services-mini-moka")]
245 Scheme::MiniMoka,
246 #[cfg(feature = "services-moka")]
247 Scheme::Moka,
248 #[cfg(feature = "services-monoiofs")]
249 Scheme::Monoiofs,
250 #[cfg(feature = "services-mysql")]
251 Scheme::Mysql,
252 #[cfg(feature = "services-obs")]
253 Scheme::Obs,
254 #[cfg(feature = "services-onedrive")]
255 Scheme::Onedrive,
256 #[cfg(feature = "services-postgresql")]
257 Scheme::Postgresql,
258 #[cfg(feature = "services-gdrive")]
259 Scheme::Gdrive,
260 #[cfg(feature = "services-oss")]
261 Scheme::Oss,
262 #[cfg(feature = "services-persy")]
263 Scheme::Persy,
264 #[cfg(feature = "services-redis")]
265 Scheme::Redis,
266 #[cfg(feature = "services-rocksdb")]
267 Scheme::Rocksdb,
268 #[cfg(feature = "services-s3")]
269 Scheme::S3,
270 #[cfg(feature = "services-seafile")]
271 Scheme::Seafile,
272 #[cfg(feature = "services-upyun")]
273 Scheme::Upyun,
274 #[cfg(feature = "services-yandex-disk")]
275 Scheme::YandexDisk,
276 #[cfg(feature = "services-pcloud")]
277 Scheme::Pcloud,
278 #[cfg(feature = "services-sftp")]
279 Scheme::Sftp,
280 #[cfg(feature = "services-sled")]
281 Scheme::Sled,
282 #[cfg(feature = "services-sqlite")]
283 Scheme::Sqlite,
284 #[cfg(feature = "services-swift")]
285 Scheme::Swift,
286 #[cfg(feature = "services-tikv")]
287 Scheme::Tikv,
288 #[cfg(feature = "services-vercel-artifacts")]
289 Scheme::VercelArtifacts,
290 #[cfg(feature = "services-vercel-blob")]
291 Scheme::VercelBlob,
292 #[cfg(feature = "services-webdav")]
293 Scheme::Webdav,
294 #[cfg(feature = "services-webhdfs")]
295 Scheme::Webhdfs,
296 #[cfg(feature = "services-redb")]
297 Scheme::Redb,
298 #[cfg(feature = "services-mongodb")]
299 Scheme::Mongodb,
300 #[cfg(feature = "services-hdfs-native")]
301 Scheme::HdfsNative,
302 #[cfg(feature = "services-surrealdb")]
303 Scheme::Surrealdb,
304 #[cfg(feature = "services-lakefs")]
305 Scheme::Lakefs,
306 ])
307 }
308}
309
310impl Default for Scheme {
311 fn default() -> Self {
312 Self::Memory
313 }
314}
315
316impl Display for Scheme {
317 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
318 write!(f, "{}", self.into_static())
319 }
320}
321
322impl FromStr for Scheme {
323 type Err = Error;
324
325 fn from_str(s: &str) -> Result<Self, Self::Err> {
326 let s = s.to_lowercase();
327 match s.as_str() {
328 "aliyun_drive" => Ok(Scheme::AliyunDrive),
329 "azblob" => Ok(Scheme::Azblob),
330 "alluxio" => Ok(Scheme::Alluxio),
331 "azdls" | "azdfs" | "abfs" => Ok(Scheme::Azdls),
336 "b2" => Ok(Scheme::B2),
337 "cacache" => Ok(Scheme::Cacache),
338 "compfs" => Ok(Scheme::Compfs),
339 "cloudflare_kv" => Ok(Scheme::CloudflareKv),
340 "cos" => Ok(Scheme::Cos),
341 "d1" => Ok(Scheme::D1),
342 "dashmap" => Ok(Scheme::Dashmap),
343 "dropbox" => Ok(Scheme::Dropbox),
344 "etcd" => Ok(Scheme::Etcd),
345 "dbfs" => Ok(Scheme::Dbfs),
346 "fs" => Ok(Scheme::Fs),
347 "gcs" => Ok(Scheme::Gcs),
348 "gdrive" => Ok(Scheme::Gdrive),
349 "ghac" => Ok(Scheme::Ghac),
350 "gridfs" => Ok(Scheme::Gridfs),
351 "github" => Ok(Scheme::Github),
352 "hdfs" => Ok(Scheme::Hdfs),
353 "http" | "https" => Ok(Scheme::Http),
354 "huggingface" | "hf" => Ok(Scheme::Huggingface),
355 "ftp" | "ftps" => Ok(Scheme::Ftp),
356 "ipfs" | "ipns" => Ok(Scheme::Ipfs),
357 "ipmfs" => Ok(Scheme::Ipmfs),
358 "koofr" => Ok(Scheme::Koofr),
359 "memcached" => Ok(Scheme::Memcached),
360 "memory" => Ok(Scheme::Memory),
361 "mysql" => Ok(Scheme::Mysql),
362 "sqlite" => Ok(Scheme::Sqlite),
363 "mini_moka" => Ok(Scheme::MiniMoka),
364 "moka" => Ok(Scheme::Moka),
365 "monoiofs" => Ok(Scheme::Monoiofs),
366 "obs" => Ok(Scheme::Obs),
367 "onedrive" => Ok(Scheme::Onedrive),
368 "persy" => Ok(Scheme::Persy),
369 "postgresql" => Ok(Scheme::Postgresql),
370 "redb" => Ok(Scheme::Redb),
371 "redis" => Ok(Scheme::Redis),
372 "rocksdb" => Ok(Scheme::Rocksdb),
373 "s3" => Ok(Scheme::S3),
374 "seafile" => Ok(Scheme::Seafile),
375 "upyun" => Ok(Scheme::Upyun),
376 "yandex_disk" => Ok(Scheme::YandexDisk),
377 "pcloud" => Ok(Scheme::Pcloud),
378 "sftp" => Ok(Scheme::Sftp),
379 "sled" => Ok(Scheme::Sled),
380 "swift" => Ok(Scheme::Swift),
381 "oss" => Ok(Scheme::Oss),
382 "vercel_artifacts" => Ok(Scheme::VercelArtifacts),
383 "vercel_blob" => Ok(Scheme::VercelBlob),
384 "webdav" => Ok(Scheme::Webdav),
385 "webhdfs" => Ok(Scheme::Webhdfs),
386 "tikv" => Ok(Scheme::Tikv),
387 "azfile" => Ok(Scheme::Azfile),
388 "mongodb" => Ok(Scheme::Mongodb),
389 "hdfs_native" => Ok(Scheme::HdfsNative),
390 "surrealdb" => Ok(Scheme::Surrealdb),
391 "lakefs" => Ok(Scheme::Lakefs),
392 _ => Ok(Scheme::Custom(Box::leak(s.into_boxed_str()))),
393 }
394 }
395}
396
397impl From<Scheme> for &'static str {
398 fn from(v: Scheme) -> Self {
399 match v {
400 Scheme::AliyunDrive => "aliyun_drive",
401 Scheme::Atomicserver => "atomicserver",
402 Scheme::Azblob => "azblob",
403 Scheme::Azdls => "azdls",
404 Scheme::B2 => "b2",
405 Scheme::Cacache => "cacache",
406 Scheme::CloudflareKv => "cloudflare_kv",
407 Scheme::Cos => "cos",
408 Scheme::Compfs => "compfs",
409 Scheme::D1 => "d1",
410 Scheme::Dashmap => "dashmap",
411 Scheme::Etcd => "etcd",
412 Scheme::Dbfs => "dbfs",
413 Scheme::Fs => "fs",
414 Scheme::Gcs => "gcs",
415 Scheme::Ghac => "ghac",
416 Scheme::Gridfs => "gridfs",
417 Scheme::Hdfs => "hdfs",
418 Scheme::Http => "http",
419 Scheme::Huggingface => "huggingface",
420 Scheme::Foundationdb => "foundationdb",
421 Scheme::Ftp => "ftp",
422 Scheme::Ipfs => "ipfs",
423 Scheme::Ipmfs => "ipmfs",
424 Scheme::Icloud => "icloud",
425 Scheme::Koofr => "koofr",
426 Scheme::Memcached => "memcached",
427 Scheme::Memory => "memory",
428 Scheme::MiniMoka => "mini_moka",
429 Scheme::Moka => "moka",
430 Scheme::Monoiofs => "monoiofs",
431 Scheme::Obs => "obs",
432 Scheme::Onedrive => "onedrive",
433 Scheme::Persy => "persy",
434 Scheme::Postgresql => "postgresql",
435 Scheme::Mysql => "mysql",
436 Scheme::Gdrive => "gdrive",
437 Scheme::Github => "github",
438 Scheme::Dropbox => "dropbox",
439 Scheme::Redis => "redis",
440 Scheme::Rocksdb => "rocksdb",
441 Scheme::S3 => "s3",
442 Scheme::Seafile => "seafile",
443 Scheme::Sftp => "sftp",
444 Scheme::Sled => "sled",
445 Scheme::Swift => "swift",
446 Scheme::VercelArtifacts => "vercel_artifacts",
447 Scheme::VercelBlob => "vercel_blob",
448 Scheme::Oss => "oss",
449 Scheme::Webdav => "webdav",
450 Scheme::Webhdfs => "webhdfs",
451 Scheme::Redb => "redb",
452 Scheme::Tikv => "tikv",
453 Scheme::Azfile => "azfile",
454 Scheme::Sqlite => "sqlite",
455 Scheme::Mongodb => "mongodb",
456 Scheme::Alluxio => "alluxio",
457 Scheme::Upyun => "upyun",
458 Scheme::YandexDisk => "yandex_disk",
459 Scheme::Pcloud => "pcloud",
460 Scheme::HdfsNative => "hdfs_native",
461 Scheme::Surrealdb => "surrealdb",
462 Scheme::Lakefs => "lakefs",
463 Scheme::NebulaGraph => "nebula_graph",
464 Scheme::Custom(v) => v,
465 }
466 }
467}
468
469impl From<Scheme> for String {
470 fn from(v: Scheme) -> Self {
471 v.into_static().to_string()
472 }
473}