arta_async_std/
fs.rs

1//! Async-std specific filesystem manipulation implementations.
2mod 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}