]> git.r.bdr.sh - rbdr/page/blob - src/file_handler/mod.rs
64224ee4061e896b51358f0d36615d903695e65c
[rbdr/page] / src / file_handler / mod.rs
1 mod file_strategies;
2
3 use file_strategies::file::Strategy as FileStrategy;
4 use file_strategies::gemini::Strategy as GeminiStrategy;
5 use file_strategies::layout::Strategy as LayoutStrategy;
6
7 use std::path::PathBuf;
8 use std::fs::read_to_string;
9
10 pub struct FileHandler {
11 pub strategies: Vec<Box<dyn FileHandlerStrategy>>,
12 pub layout: Option<String>
13 }
14
15 impl Default for FileHandler {
16 fn default() -> FileHandler {
17 FileHandler {
18 strategies: vec![
19 Box::new(GeminiStrategy{}),
20 Box::new(LayoutStrategy{}),
21 Box::new(FileStrategy{}),
22 ],
23 layout: None
24 }
25 }
26 }
27
28 impl FileHandler {
29 pub fn identify(&self, path: &PathBuf) -> FileType {
30 for strategy in self.strategies.iter() {
31 if strategy.is(&path) {
32 return strategy.identify();
33 }
34 }
35 FileType::Unknown
36 }
37
38 pub fn get_layout_or_panic(&mut self, files: &Vec<File>) {
39 for file in files {
40 match file.file_type {
41 FileType::Layout => {
42 let layout_text = read_to_string(&file.path).unwrap();
43 self.layout = Some(layout_text);
44 return;
45 },
46 _ => {}
47 }
48 }
49 panic!("No layout found. Please ensure there's a _layout.html file at the root");
50 }
51
52 pub fn handle_all(&self, source: &PathBuf, destination: &PathBuf, files: &Vec<File>) {
53 for file in files {
54 self.handle(source, destination, file);
55 }
56 }
57
58 pub fn handle(&self, source: &PathBuf, destination: &PathBuf, file: &File) {
59 for strategy in self.strategies.iter() {
60 if strategy.can_handle(&file.file_type) {
61 return strategy.handle(source, destination, file);
62 }
63 }
64 }
65 }
66
67 pub trait FileHandlerStrategy {
68 fn is(&self, path: &PathBuf) -> bool;
69 fn identify(&self) -> FileType;
70 fn can_handle(&self, file_type: &FileType) -> bool;
71 fn handle(&self, source: &PathBuf, destination: &PathBuf, file: &File);
72 }
73
74 pub enum FileType {
75 Gemini,
76 File,
77 Layout,
78 Unknown,
79 }
80
81 pub struct File {
82 pub path: PathBuf,
83 pub file_type: FileType,
84 }