mod.rs 980 B

12345678910111213141516171819202122232425262728293031323334
  1. use std::{path::Path, sync::Arc, time::SystemTime};
  2. use async_trait::async_trait;
  3. use crate::BASE_PATH;
  4. pub mod local;
  5. lazy_static! {
  6. static ref STORAGE_PROVIDER: Arc<dyn StorageProvider> = Arc::new(
  7. local::LocalStorageProvider::new("./".into(), BASE_PATH.to_string())
  8. );
  9. }
  10. #[async_trait]
  11. pub trait StorageProvider: Sync + Send {
  12. async fn list_directory(&self, path_in_provider: &str) -> Option<Vec<StorageEntry>>;
  13. /// 根据完整的请求路径,返回在存储提供者中的路径
  14. fn path_in_provider(&self, full_path: &str) -> Option<String>;
  15. }
  16. #[derive(Debug, Clone)]
  17. pub struct StorageEntry {
  18. pub name: String,
  19. pub url: String,
  20. pub modified: SystemTime,
  21. pub size: Option<usize>,
  22. }
  23. pub fn select_provider(full_path: &str) -> Option<(Arc<dyn StorageProvider>, String)> {
  24. let provider = STORAGE_PROVIDER.clone();
  25. let path_in_provider = provider.path_in_provider(full_path)?;
  26. Some((provider, path_in_provider))
  27. }