dioxus_html/
file_data.rs

1pub trait HasFileData: std::any::Any {
2    fn files(&self) -> Option<std::sync::Arc<dyn FileEngine>> {
3        None
4    }
5}
6
7#[cfg(feature = "serialize")]
8/// A file engine that serializes files to bytes
9#[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq, Clone)]
10pub struct SerializedFileEngine {
11    pub files: std::collections::HashMap<String, Vec<u8>>,
12}
13
14#[cfg(feature = "serialize")]
15#[async_trait::async_trait(?Send)]
16impl FileEngine for SerializedFileEngine {
17    fn files(&self) -> Vec<String> {
18        self.files.keys().cloned().collect()
19    }
20
21    async fn file_size(&self, file: &str) -> Option<u64> {
22        let file = self.files.get(file)?;
23        Some(file.len() as u64)
24    }
25
26    async fn read_file(&self, file: &str) -> Option<Vec<u8>> {
27        self.files.get(file).cloned()
28    }
29
30    async fn read_file_to_string(&self, file: &str) -> Option<String> {
31        self.read_file(file)
32            .await
33            .map(|bytes| String::from_utf8_lossy(&bytes).to_string())
34    }
35
36    async fn get_native_file(&self, file: &str) -> Option<Box<dyn std::any::Any>> {
37        self.read_file(file)
38            .await
39            .map(|val| Box::new(val) as Box<dyn std::any::Any>)
40    }
41}
42
43#[async_trait::async_trait(?Send)]
44pub trait FileEngine {
45    // get a list of file names
46    fn files(&self) -> Vec<String>;
47
48    // get the size of a file
49    async fn file_size(&self, file: &str) -> Option<u64>;
50
51    // read a file to bytes
52    async fn read_file(&self, file: &str) -> Option<Vec<u8>>;
53
54    // read a file to string
55    async fn read_file_to_string(&self, file: &str) -> Option<String>;
56
57    // returns a file in platform's native representation
58    async fn get_native_file(&self, file: &str) -> Option<Box<dyn std::any::Any>>;
59}