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, Default)]
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 #[default]
102 Memory,
103 MiniMoka,
105 Moka,
107 Monoiofs,
109 Obs,
111 Onedrive,
113 Gdrive,
115 Dropbox,
117 Oss,
119 Persy,
121 Redis,
123 Postgresql,
125 Mysql,
127 Sqlite,
129 Rocksdb,
131 S3,
133 Sftp,
135 Sled,
137 Swift,
139 VercelArtifacts,
141 Webdav,
143 Webhdfs,
145 Redb,
147 Tikv,
149 Azfile,
151 Mongodb,
153 Gridfs,
155 Github,
157 HdfsNative,
159 Surrealdb,
161 Lakefs,
163 NebulaGraph,
165 Custom(&'static str),
172}
173
174impl Scheme {
175 pub fn into_static(self) -> &'static str {
177 self.into()
178 }
179
180 pub fn enabled() -> HashSet<Scheme> {
196 HashSet::from([
197 #[cfg(feature = "services-aliyun-drive")]
198 Scheme::AliyunDrive,
199 #[cfg(feature = "services-alluxio")]
200 Scheme::Alluxio,
201 #[cfg(feature = "services-azblob")]
202 Scheme::Azblob,
203 #[cfg(feature = "services-azdls")]
204 Scheme::Azdls,
205 #[cfg(feature = "services-azfile")]
206 Scheme::Azfile,
207 #[cfg(feature = "services-b2")]
208 Scheme::B2,
209 #[cfg(feature = "services-cacache")]
210 Scheme::Cacache,
211 #[cfg(feature = "services-cos")]
212 Scheme::Cos,
213 #[cfg(feature = "services-compfs")]
214 Scheme::Compfs,
215 #[cfg(feature = "services-dashmap")]
216 Scheme::Dashmap,
217 #[cfg(feature = "services-dropbox")]
218 Scheme::Dropbox,
219 #[cfg(feature = "services-etcd")]
220 Scheme::Etcd,
221 #[cfg(feature = "services-foundationdb")]
222 Scheme::Foundationdb,
223 #[cfg(feature = "services-fs")]
224 Scheme::Fs,
225 #[cfg(feature = "services-ftp")]
226 Scheme::Ftp,
227 #[cfg(feature = "services-gcs")]
228 Scheme::Gcs,
229 #[cfg(feature = "services-ghac")]
230 Scheme::Ghac,
231 #[cfg(feature = "services-hdfs")]
232 Scheme::Hdfs,
233 #[cfg(feature = "services-http")]
234 Scheme::Http,
235 #[cfg(feature = "services-huggingface")]
236 Scheme::Huggingface,
237 #[cfg(feature = "services-ipfs")]
238 Scheme::Ipfs,
239 #[cfg(feature = "services-ipmfs")]
240 Scheme::Ipmfs,
241 #[cfg(feature = "services-memcached")]
242 Scheme::Memcached,
243 #[cfg(feature = "services-memory")]
244 Scheme::Memory,
245 #[cfg(feature = "services-mini-moka")]
246 Scheme::MiniMoka,
247 #[cfg(feature = "services-moka")]
248 Scheme::Moka,
249 #[cfg(feature = "services-monoiofs")]
250 Scheme::Monoiofs,
251 #[cfg(feature = "services-mysql")]
252 Scheme::Mysql,
253 #[cfg(feature = "services-obs")]
254 Scheme::Obs,
255 #[cfg(feature = "services-onedrive")]
256 Scheme::Onedrive,
257 #[cfg(feature = "services-postgresql")]
258 Scheme::Postgresql,
259 #[cfg(feature = "services-gdrive")]
260 Scheme::Gdrive,
261 #[cfg(feature = "services-oss")]
262 Scheme::Oss,
263 #[cfg(feature = "services-persy")]
264 Scheme::Persy,
265 #[cfg(feature = "services-redis")]
266 Scheme::Redis,
267 #[cfg(feature = "services-rocksdb")]
268 Scheme::Rocksdb,
269 #[cfg(feature = "services-s3")]
270 Scheme::S3,
271 #[cfg(feature = "services-seafile")]
272 Scheme::Seafile,
273 #[cfg(feature = "services-upyun")]
274 Scheme::Upyun,
275 #[cfg(feature = "services-yandex-disk")]
276 Scheme::YandexDisk,
277 #[cfg(feature = "services-pcloud")]
278 Scheme::Pcloud,
279 #[cfg(feature = "services-sftp")]
280 Scheme::Sftp,
281 #[cfg(feature = "services-sled")]
282 Scheme::Sled,
283 #[cfg(feature = "services-sqlite")]
284 Scheme::Sqlite,
285 #[cfg(feature = "services-swift")]
286 Scheme::Swift,
287 #[cfg(feature = "services-tikv")]
288 Scheme::Tikv,
289 #[cfg(feature = "services-vercel-artifacts")]
290 Scheme::VercelArtifacts,
291 #[cfg(feature = "services-vercel-blob")]
292 Scheme::VercelBlob,
293 #[cfg(feature = "services-webdav")]
294 Scheme::Webdav,
295 #[cfg(feature = "services-webhdfs")]
296 Scheme::Webhdfs,
297 #[cfg(feature = "services-redb")]
298 Scheme::Redb,
299 #[cfg(feature = "services-mongodb")]
300 Scheme::Mongodb,
301 #[cfg(feature = "services-hdfs-native")]
302 Scheme::HdfsNative,
303 #[cfg(feature = "services-surrealdb")]
304 Scheme::Surrealdb,
305 #[cfg(feature = "services-lakefs")]
306 Scheme::Lakefs,
307 #[cfg(feature = "services-cloudflare-kv")]
308 Scheme::CloudflareKv,
309 ])
310 }
311}
312
313impl Display for Scheme {
314 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
315 write!(f, "{}", self.into_static())
316 }
317}
318
319impl FromStr for Scheme {
320 type Err = Error;
321
322 fn from_str(s: &str) -> Result<Self, Self::Err> {
323 let s = s.to_lowercase();
324 match s.as_str() {
325 "aliyun-drive" | "aliyun_drive" => Ok(Scheme::AliyunDrive),
326 "azblob" => Ok(Scheme::Azblob),
327 "alluxio" => Ok(Scheme::Alluxio),
328 "azdls" | "azdfs" | "abfs" => Ok(Scheme::Azdls),
333 "b2" => Ok(Scheme::B2),
334 "cacache" => Ok(Scheme::Cacache),
335 "compfs" => Ok(Scheme::Compfs),
336 "cloudflare-kv" | "cloudflare_kv" => Ok(Scheme::CloudflareKv),
337 "cos" => Ok(Scheme::Cos),
338 "d1" => Ok(Scheme::D1),
339 "dashmap" => Ok(Scheme::Dashmap),
340 "dropbox" => Ok(Scheme::Dropbox),
341 "etcd" => Ok(Scheme::Etcd),
342 "dbfs" => Ok(Scheme::Dbfs),
343 "fs" => Ok(Scheme::Fs),
344 "gcs" => Ok(Scheme::Gcs),
345 "gdrive" => Ok(Scheme::Gdrive),
346 "ghac" => Ok(Scheme::Ghac),
347 "gridfs" => Ok(Scheme::Gridfs),
348 "github" => Ok(Scheme::Github),
349 "hdfs" => Ok(Scheme::Hdfs),
350 "http" | "https" => Ok(Scheme::Http),
351 "huggingface" | "hf" => Ok(Scheme::Huggingface),
352 "ftp" | "ftps" => Ok(Scheme::Ftp),
353 "ipfs" | "ipns" => Ok(Scheme::Ipfs),
354 "ipmfs" => Ok(Scheme::Ipmfs),
355 "koofr" => Ok(Scheme::Koofr),
356 "memcached" => Ok(Scheme::Memcached),
357 "memory" => Ok(Scheme::Memory),
358 "mysql" => Ok(Scheme::Mysql),
359 "sqlite" => Ok(Scheme::Sqlite),
360 "mini-moka" | "mini_moka" => Ok(Scheme::MiniMoka),
361 "moka" => Ok(Scheme::Moka),
362 "monoiofs" => Ok(Scheme::Monoiofs),
363 "obs" => Ok(Scheme::Obs),
364 "onedrive" => Ok(Scheme::Onedrive),
365 "persy" => Ok(Scheme::Persy),
366 "postgresql" => Ok(Scheme::Postgresql),
367 "redb" => Ok(Scheme::Redb),
368 "redis" => Ok(Scheme::Redis),
369 "rocksdb" => Ok(Scheme::Rocksdb),
370 "s3" => Ok(Scheme::S3),
371 "seafile" => Ok(Scheme::Seafile),
372 "upyun" => Ok(Scheme::Upyun),
373 "yandex-disk" | "yandex_disk" => Ok(Scheme::YandexDisk),
374 "pcloud" => Ok(Scheme::Pcloud),
375 "sftp" => Ok(Scheme::Sftp),
376 "sled" => Ok(Scheme::Sled),
377 "swift" => Ok(Scheme::Swift),
378 "oss" => Ok(Scheme::Oss),
379 "vercel-artifacts" | "vercel_artifacts" => Ok(Scheme::VercelArtifacts),
380 "vercel-blob" | "vercel_blob" => Ok(Scheme::VercelBlob),
381 "webdav" => Ok(Scheme::Webdav),
382 "webhdfs" => Ok(Scheme::Webhdfs),
383 "tikv" => Ok(Scheme::Tikv),
384 "azfile" => Ok(Scheme::Azfile),
385 "mongodb" => Ok(Scheme::Mongodb),
386 "hdfs-native" | "hdfs_native" => Ok(Scheme::HdfsNative),
387 "surrealdb" => Ok(Scheme::Surrealdb),
388 "lakefs" => Ok(Scheme::Lakefs),
389 "nebula-graph" | "nebula_graph" => Ok(Scheme::NebulaGraph),
390 _ => Ok(Scheme::Custom(Box::leak(s.into_boxed_str()))),
391 }
392 }
393}
394
395impl From<Scheme> for &'static str {
396 fn from(v: Scheme) -> Self {
397 match v {
398 Scheme::AliyunDrive => "aliyun-drive",
399 Scheme::Atomicserver => "atomicserver",
400 Scheme::Azblob => "azblob",
401 Scheme::Azdls => "azdls",
402 Scheme::B2 => "b2",
403 Scheme::Cacache => "cacache",
404 Scheme::CloudflareKv => "cloudflare-kv",
405 Scheme::Cos => "cos",
406 Scheme::Compfs => "compfs",
407 Scheme::D1 => "d1",
408 Scheme::Dashmap => "dashmap",
409 Scheme::Etcd => "etcd",
410 Scheme::Dbfs => "dbfs",
411 Scheme::Fs => "fs",
412 Scheme::Gcs => "gcs",
413 Scheme::Ghac => "ghac",
414 Scheme::Gridfs => "gridfs",
415 Scheme::Hdfs => "hdfs",
416 Scheme::Http => "http",
417 Scheme::Huggingface => "huggingface",
418 Scheme::Foundationdb => "foundationdb",
419 Scheme::Ftp => "ftp",
420 Scheme::Ipfs => "ipfs",
421 Scheme::Ipmfs => "ipmfs",
422 Scheme::Icloud => "icloud",
423 Scheme::Koofr => "koofr",
424 Scheme::Memcached => "memcached",
425 Scheme::Memory => "memory",
426 Scheme::MiniMoka => "mini-moka",
427 Scheme::Moka => "moka",
428 Scheme::Monoiofs => "monoiofs",
429 Scheme::Obs => "obs",
430 Scheme::Onedrive => "onedrive",
431 Scheme::Persy => "persy",
432 Scheme::Postgresql => "postgresql",
433 Scheme::Mysql => "mysql",
434 Scheme::Gdrive => "gdrive",
435 Scheme::Github => "github",
436 Scheme::Dropbox => "dropbox",
437 Scheme::Redis => "redis",
438 Scheme::Rocksdb => "rocksdb",
439 Scheme::S3 => "s3",
440 Scheme::Seafile => "seafile",
441 Scheme::Sftp => "sftp",
442 Scheme::Sled => "sled",
443 Scheme::Swift => "swift",
444 Scheme::VercelArtifacts => "vercel-artifacts",
445 Scheme::VercelBlob => "vercel-blob",
446 Scheme::Oss => "oss",
447 Scheme::Webdav => "webdav",
448 Scheme::Webhdfs => "webhdfs",
449 Scheme::Redb => "redb",
450 Scheme::Tikv => "tikv",
451 Scheme::Azfile => "azfile",
452 Scheme::Sqlite => "sqlite",
453 Scheme::Mongodb => "mongodb",
454 Scheme::Alluxio => "alluxio",
455 Scheme::Upyun => "upyun",
456 Scheme::YandexDisk => "yandex-disk",
457 Scheme::Pcloud => "pcloud",
458 Scheme::HdfsNative => "hdfs-native",
459 Scheme::Surrealdb => "surrealdb",
460 Scheme::Lakefs => "lakefs",
461 Scheme::NebulaGraph => "nebula-graph",
462 Scheme::Custom(v) => v,
463 }
464 }
465}
466
467impl From<Scheme> for String {
468 fn from(v: Scheme) -> Self {
469 v.into_static().to_string()
470 }
471}