native_file_engine.rs 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. use std::any::Any;
  2. use std::path::PathBuf;
  3. use crate::FileEngine;
  4. use tokio::fs::File;
  5. use tokio::io::AsyncReadExt;
  6. pub struct NativeFileEngine {
  7. files: Vec<PathBuf>,
  8. }
  9. impl NativeFileEngine {
  10. pub fn new(files: Vec<PathBuf>) -> Self {
  11. Self { files }
  12. }
  13. }
  14. #[async_trait::async_trait(?Send)]
  15. impl FileEngine for NativeFileEngine {
  16. fn files(&self) -> Vec<String> {
  17. self.files
  18. .iter()
  19. .filter_map(|f| Some(f.to_str()?.to_string()))
  20. .collect()
  21. }
  22. async fn read_file(&self, file: &str) -> Option<Vec<u8>> {
  23. let mut file = File::open(file).await.ok()?;
  24. let mut contents = Vec::new();
  25. file.read_to_end(&mut contents).await.ok()?;
  26. Some(contents)
  27. }
  28. async fn read_file_to_string(&self, file: &str) -> Option<String> {
  29. let mut file = File::open(file).await.ok()?;
  30. let mut contents = String::new();
  31. file.read_to_string(&mut contents).await.ok()?;
  32. Some(contents)
  33. }
  34. async fn get_native_file(&self, file: &str) -> Option<Box<dyn Any>> {
  35. let file = File::open(file).await.ok()?;
  36. Some(Box::new(file))
  37. }
  38. }