]> git.r.bdr.sh - rbdr/page/blobdiff - src/file_handler/mod.rs
Read the files
[rbdr/page] / src / file_handler / mod.rs
diff --git a/src/file_handler/mod.rs b/src/file_handler/mod.rs
new file mode 100644 (file)
index 0000000..8038b3c
--- /dev/null
@@ -0,0 +1,54 @@
+mod file_strategies;
+
+use file_strategies::file::Strategy as FileStrategy;
+use std::path::PathBuf;
+
+pub struct FileHandler {
+   pub strategies: Vec<Box<dyn FileHandlerStrategy>>
+}
+
+impl Default for FileHandler {
+    fn default() -> FileHandler {
+        FileHandler {
+            strategies: vec![Box::new(FileStrategy{})]
+        }
+    }
+}
+
+impl FileHandler {
+    pub fn identify(&self, path: &PathBuf) -> FileType {
+        for strategy in self.strategies.iter() {
+            if strategy.is(&path) {
+                return strategy.identify();
+            }
+        }
+        FileType::Unknown
+    }
+
+    pub fn handle(&self, path: &PathBuf) {
+        for strategy in self.strategies.iter() {
+            if strategy.can_handle(path) {
+                return strategy.handle(path);
+            }
+        }
+    }
+}
+
+pub trait FileHandlerStrategy {
+    fn is(&self, path: &PathBuf) -> bool;
+    fn identify(&self) -> FileType;
+    fn can_handle(&self, path: &PathBuf) -> bool;
+    fn handle(&self, path: &PathBuf);
+}
+
+pub enum FileType {
+    Gemini,
+    File,
+    Layout,
+    Unknown,
+}
+
+pub struct File {
+    pub path: PathBuf,
+    pub file_type: FileType,
+}