1pub mod storage_type;
2pub mod timestamp;
3
4pub mod igdb {
5 tonic::include_proto!("igdb");
6}
7
8pub mod retrom {
9 pub mod files {
10 tonic::include_proto!("retrom.files");
11 }
12
13 use std::path::PathBuf;
14
15 tonic::include_proto!("retrom");
16
17 pub const FILE_DESCRIPTOR_SET: &[u8] = tonic::include_file_descriptor_set!("retrom_descriptor");
18
19 impl TryFrom<PathBuf> for crate::retrom::FilesystemNode {
20 type Error = ();
21
22 fn try_from(_path: PathBuf) -> Result<Self, Self::Error> {
23 let _path = _path.canonicalize().or(Err(()))?;
24 let path = _path.to_str().ok_or(())?.into();
25
26 if path == "/" {
27 return Ok(crate::retrom::FilesystemNode {
28 node_type: crate::retrom::FilesystemNodeType::Directory.into(),
29 path,
30 name: "/".into(),
31 });
32 };
33
34 let name = _path.file_name().ok_or(())?.to_str().ok_or(())?.into();
35
36 let node_type = match _path.is_dir() {
37 true => crate::retrom::FilesystemNodeType::Directory.into(),
38 false => crate::retrom::FilesystemNodeType::File.into(),
39 };
40
41 Ok(crate::retrom::FilesystemNode {
42 node_type,
43 path,
44 name,
45 })
46 }
47 }
48
49 impl TryFrom<PathBuf> for crate::retrom::files::FileStat {
50 type Error = ();
51
52 fn try_from(path_buf: PathBuf) -> Result<Self, Self::Error> {
53 let metadata = path_buf.metadata().ok();
54 let path = path_buf.to_str().ok_or(())?.into();
55
56 let node_type = match metadata.as_ref().map(|m| m.is_dir()) {
57 Some(true) => crate::retrom::FilesystemNodeType::Directory as i32,
58 Some(false) => crate::retrom::FilesystemNodeType::File as i32,
59 None => crate::retrom::FilesystemNodeType::Unknown as i32,
60 };
61
62 let created_at = metadata
63 .as_ref()
64 .and_then(|m| m.created().ok().map(|t| t.into()));
65
66 let updated_at = metadata
67 .as_ref()
68 .and_then(|m| m.modified().ok().map(|t| t.into()));
69
70 let byte_size = metadata.as_ref().map(|m| m.len());
71
72 Ok(crate::retrom::files::FileStat {
73 path,
74 node_type,
75 created_at,
76 updated_at,
77 byte_size,
78 })
79 }
80 }
81}