pillow_http/response/
static_files.rs

1use pillow_fs::FS;
2
3#[derive(Debug)]
4#[allow(dead_code)]
5pub struct StaticFiles {
6    pub files: Vec<StaticFile>,
7}
8
9#[derive(Debug, Clone)]
10pub struct StaticFile {
11    // pub kind: StaticFileType,
12    pub route_absolute: String,
13    pub path: String,
14    pub name_file: String,
15    pub content: Vec<u8>,
16    pub lenght: usize,
17    file_original: pillow_fs::File,
18}
19
20#[derive(Debug, Clone)]
21pub enum StaticFileType {
22    CSS,
23    JS,
24}
25
26impl Default for StaticFiles {
27    fn default() -> Self {
28        Self::new("resources")
29    }
30}
31
32impl StaticFiles {
33    #[allow(dead_code)]
34    pub fn new(directory: &str) -> StaticFiles {
35        let directory_files = FS::get_all_in_directories(directory);
36
37        let vec_files = Self::normalize(directory_files);
38
39        let mut files: Vec<StaticFile> = Vec::new();
40        for f in vec_files {
41            files.push(StaticFile::new(f.clone()));
42        }
43
44        StaticFiles { files }
45    }
46
47    pub fn normalize(directory: Vec<pillow_fs::File>) -> Vec<pillow_fs::File> {
48        let mut files: Vec<pillow_fs::File> = Vec::new();
49        let directories: Vec<pillow_fs::File> = directory.clone();
50
51        fn lop(directories: &[pillow_fs::File], files: &mut Vec<pillow_fs::File>) {
52            for f in directories {
53                if f.file_type.is_dir() {
54                    let d = FS::get_all_in_directories(&f.path);
55                    lop(&d, files);
56                }
57
58                if f.file_type.is_file() {
59                    files.push(f.clone())
60                }
61            }
62        }
63
64        lop(&directories, &mut files);
65
66        files
67    }
68}
69
70/*
71impl StaticFiles {
72    pub fn get_css_files(&self) -> Vec<StaticFile> {
73        let mut css: Vec<StaticFile> = Vec::new();
74
75        for c in &self.files {
76            match c.kind {
77                StaticFileType::CSS => css.push(c.clone()),
78                StaticFileType::JS => {}
79            }
80        }
81
82        css
83    }
84
85    pub fn get_javascript_files(&self) -> Vec<StaticFile> {
86        let mut js: Vec<StaticFile> = Vec::new();
87
88        for j in &self.files {
89            match j.kind {
90                StaticFileType::CSS => {}
91                StaticFileType::JS => js.push(j.clone()),
92            }
93        }
94
95        js
96    }
97}
98*/
99
100impl StaticFile {
101    pub fn new(file: pillow_fs::File) -> StaticFile {
102        // let re = Regex::new(r"[a-zA-Z]+\.[a-zA-Z]+");
103        // let regex = re.unwrap();
104
105        let route_absolute = format!("{}", &file.path);
106
107        let content = file.clone().content.unwrap();
108
109        let path = format!("/{}", &route_absolute);
110
111        StaticFile {
112            // kind,
113            route_absolute: route_absolute.to_string(),
114            path,
115            name_file: route_absolute.to_string(),
116            content: content.clone(),
117            lenght: content.len(),
118            file_original: file.clone(),
119        }
120    }
121}
122
123impl StaticFile {
124    pub fn metadata(&self) -> std::fs::Metadata {
125        self.file_original.metadata.clone()
126    }
127
128    pub fn file_type(&self) -> std::fs::FileType {
129        self.file_original.file_type.clone()
130    }
131
132    pub fn content_type(&self) -> Option<String> {
133        self.file_original.clone().content_type
134    }
135}