1mod dir_entry;
3mod file;
4
5pub use dir_entry::*;
6pub use file::*;
7
8use crate::AsyncStdGlobalRuntime;
9use arta::fs::FSRuntime;
10use async_std::stream::StreamExt;
11use futures::{prelude::Future, TryFutureExt};
12use std::path::PathBuf;
13
14impl FSRuntime for AsyncStdGlobalRuntime {
15 type File = AsyncStdFile;
16 type DirEntry = AsyncStdDirEntry;
17
18 fn canonicalize(
19 &self,
20 path: impl AsRef<std::path::Path> + Send,
21 ) -> impl Future<Output = std::io::Result<PathBuf>> + Send {
22 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
23 async_std::fs::canonicalize(path).map_ok(Into::into)
24 }
25
26 fn copy(
27 &self,
28 from: impl AsRef<std::path::Path> + Send,
29 to: impl AsRef<std::path::Path> + Send,
30 ) -> impl Future<Output = std::io::Result<u64>> + Send {
31 let from: async_std::path::PathBuf = from.as_ref().to_owned().into();
32 let to: async_std::path::PathBuf = to.as_ref().to_owned().into();
33
34 async_std::fs::copy(from, to)
35 }
36
37 fn create_dir(
38 &self,
39 path: impl AsRef<std::path::Path> + Send,
40 ) -> impl Future<Output = std::io::Result<()>> + Send {
41 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
42 async_std::fs::create_dir(path)
43 }
44
45 fn create_dir_all(
46 &self,
47 path: impl AsRef<std::path::Path> + Send,
48 ) -> impl Future<Output = std::io::Result<()>> + Send {
49 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
50 async_std::fs::create_dir_all(path)
51 }
52
53 fn remove_dir(
54 &self,
55 path: impl AsRef<std::path::Path> + Send,
56 ) -> impl Future<Output = std::io::Result<()>> + Send {
57 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
58 async_std::fs::remove_dir(path)
59 }
60
61 fn remove_dir_all(
62 &self,
63 path: impl AsRef<std::path::Path> + Send,
64 ) -> impl Future<Output = std::io::Result<()>> + Send {
65 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
66 async_std::fs::remove_dir_all(path)
67 }
68
69 fn read_dir(
70 &self,
71 path: impl AsRef<std::path::Path> + Send,
72 ) -> impl Future<
73 Output = std::io::Result<
74 impl futures::prelude::Stream<Item = std::io::Result<Self::DirEntry>> + Send,
75 >,
76 > + Send {
77 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
78 async_std::fs::read_dir(path).map_ok(|stream| {
79 stream.map(|entry| entry.map(|entry| AsyncStdDirEntry { inner: entry }))
80 })
81 }
82
83 fn read_link(
84 &self,
85 path: impl AsRef<std::path::Path> + Send,
86 ) -> impl Future<Output = std::io::Result<PathBuf>> + Send {
87 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
88 async_std::fs::read_link(path).map_ok(Into::into)
89 }
90
91 #[cfg(unix)]
92 fn symlink(
93 &self,
94 from: impl AsRef<std::path::Path> + Send,
95 to: impl AsRef<std::path::Path> + Send,
96 ) -> impl Future<Output = std::io::Result<()>> + Send {
97 let from: async_std::path::PathBuf = from.as_ref().to_owned().into();
98 let to: async_std::path::PathBuf = to.as_ref().to_owned().into();
99
100 async_std::os::unix::fs::symlink(from, to)
101 }
102
103 #[cfg(windows)]
104 fn symlink_dir(
105 &self,
106 from: impl AsRef<std::path::Path> + Send,
107 to: impl AsRef<std::path::Path> + Send,
108 ) -> impl Future<Output = std::io::Result<()>> + Send {
109 let from: async_std::path::PathBuf = from.as_ref().to_owned().into();
110 let to: async_std::path::PathBuf = to.as_ref().to_owned().into();
111
112 async_std::os::windows::fs::symlink_dir(from, to)
113 }
114
115 #[cfg(windows)]
116 fn symlink_file(
117 &self,
118 from: impl AsRef<std::path::Path> + Send,
119 to: impl AsRef<std::path::Path> + Send,
120 ) -> impl Future<Output = std::io::Result<()>> + Send {
121 let from: async_std::path::PathBuf = from.as_ref().to_owned().into();
122 let to: async_std::path::PathBuf = to.as_ref().to_owned().into();
123
124 async_std::os::windows::fs::symlink_file(from, to)
125 }
126
127 fn hard_link(
128 &self,
129 from: impl AsRef<std::path::Path> + Send,
130 to: impl AsRef<std::path::Path> + Send,
131 ) -> impl Future<Output = std::io::Result<()>> + Send {
132 let from: async_std::path::PathBuf = from.as_ref().to_owned().into();
133 let to: async_std::path::PathBuf = to.as_ref().to_owned().into();
134
135 async_std::fs::hard_link(from, to)
136 }
137
138 fn metadata(
139 &self,
140 path: impl AsRef<std::path::Path> + Send,
141 ) -> impl Future<Output = std::io::Result<std::fs::Metadata>> + Send {
142 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
143 async_std::fs::metadata(path)
144 }
145
146 fn remove_file(
147 &self,
148 path: impl AsRef<std::path::Path> + Send,
149 ) -> impl Future<Output = std::io::Result<()>> + Send {
150 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
151 async_std::fs::remove_file(path)
152 }
153
154 fn rename(
155 &self,
156 from: impl AsRef<std::path::Path> + Send,
157 to: impl AsRef<std::path::Path> + Send,
158 ) -> impl Future<Output = std::io::Result<()>> + Send {
159 let from: async_std::path::PathBuf = from.as_ref().to_owned().into();
160 let to: async_std::path::PathBuf = to.as_ref().to_owned().into();
161
162 async_std::fs::rename(from, to)
163 }
164
165 fn set_permissions(
166 &self,
167 path: impl AsRef<std::path::Path> + Send,
168 permissions: std::fs::Permissions,
169 ) -> impl Future<Output = std::io::Result<()>> + Send {
170 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
171 async_std::fs::set_permissions(path, permissions)
172 }
173
174 fn symlink_metadata(
175 &self,
176 path: impl AsRef<std::path::Path> + Send,
177 ) -> impl Future<Output = std::io::Result<std::fs::Metadata>> + Send {
178 let path: async_std::path::PathBuf = path.as_ref().to_owned().into();
179 async_std::fs::symlink_metadata(path)
180 }
181}