1 use crate::errors::{Error, ErrorKind};
2 use std::io;
3 use std::path::Path;
4 
5 /// A builder for creating directories in various manners.
6 ///
7 /// This is a wrapper around [`tokio::fs::DirBuilder`].
8 #[derive(Debug, Default)]
9 #[cfg_attr(docsrs, doc(cfg(feature = "tokio")))]
10 pub struct DirBuilder {
11     inner: tokio::fs::DirBuilder,
12 }
13 
14 impl DirBuilder {
15     /// Creates a new set of options with default mode/security settings for all
16     /// platforms and also non-recursive.
17     ///
18     /// This is a wrapper version of [`tokio::fs::DirBuilder::new`]
19     ///
20     /// # Examples
21     ///
22     /// ```no_run
23     /// use fs_err::tokio::DirBuilder;
24     ///
25     /// let builder = DirBuilder::new();
26     /// ```
new() -> Self27     pub fn new() -> Self {
28         Default::default()
29     }
30 
31     /// Indicates whether to create directories recursively (including all parent
32     /// directories). Parents that do not exist are created with the same security and
33     /// permissions settings.
34     ///
35     /// Wrapper around [`tokio::fs::DirBuilder::recursive`].
recursive(&mut self, recursive: bool) -> &mut Self36     pub fn recursive(&mut self, recursive: bool) -> &mut Self {
37         self.inner.recursive(recursive);
38         self
39     }
40 
41     /// Creates the specified directory with the configured options.
42     ///
43     /// Wrapper around [`tokio::fs::DirBuilder::create`].
create(&self, path: impl AsRef<Path>) -> io::Result<()>44     pub async fn create(&self, path: impl AsRef<Path>) -> io::Result<()> {
45         let path = path.as_ref();
46         self.inner
47             .create(path)
48             .await
49             .map_err(|err| Error::build(err, ErrorKind::CreateDir, path))
50     }
51 }
52 
53 #[cfg(unix)]
54 impl DirBuilder {
55     /// Sets the mode to create new directories with.
56     ///
57     /// Wrapper around [`tokio::fs::DirBuilder::mode`].
mode(&mut self, mode: u32) -> &mut Self58     pub fn mode(&mut self, mode: u32) -> &mut Self {
59         self.inner.mode(mode);
60         self
61     }
62 }
63