2 use std
::io
::{self, Read, Seek, Write}
;
3 use std
::path
::{Path, PathBuf}
;
5 use crate::errors
::{Error, ErrorKind}
;
7 /// Wrapper around [`std::fs::File`][std::fs::File] which adds more helpful
8 /// information to all errors.
10 /// [std::fs::File]: https://doc.rust-lang.org/stable/std/fs/struct.File.html
17 /// Wrappers for methods from [`std::fs::File`][std::fs::File].
19 /// [std::fs::File]: https://doc.rust-lang.org/stable/std/fs/struct.File.html
21 /// Wrapper for [`File::open`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.open).
22 pub fn open
<P
>(path
: P
) -> Result
<Self, io
::Error
>
24 P
: AsRef
<Path
> + Into
<PathBuf
>,
26 match fs
::File
::open(path
.as_ref()) {
27 Ok(file
) => Ok(File
::from_parts(file
, path
.into())),
28 Err(source
) => Err(Error
::new(source
, ErrorKind
::OpenFile
, path
)),
32 /// Wrapper for [`File::create`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.create).
33 pub fn create
<P
>(path
: P
) -> Result
<Self, io
::Error
>
35 P
: AsRef
<Path
> + Into
<PathBuf
>,
37 match fs
::File
::create(path
.as_ref()) {
38 Ok(file
) => Ok(File
::from_parts(file
, path
.into())),
39 Err(source
) => Err(Error
::new(source
, ErrorKind
::CreateFile
, path
)),
43 /// Wrapper for [`OpenOptions::open`](https://doc.rust-lang.org/stable/std/fs/struct.OpenOptions.html#method.open).
44 pub fn from_options
<P
>(path
: P
, options
: &fs
::OpenOptions
) -> Result
<Self, io
::Error
>
46 P
: AsRef
<Path
> + Into
<PathBuf
>,
48 match options
.open(path
.as_ref()) {
49 Ok(file
) => Ok(File
::from_parts(file
, path
.into())),
50 Err(source
) => Err(Error
::new(source
, ErrorKind
::OpenFile
, path
)),
54 /// Wrapper for [`File::sync_all`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.sync_all).
55 pub fn sync_all(&self) -> Result
<(), io
::Error
> {
58 .map_err(|source
| self.error(source
, ErrorKind
::SyncFile
))
61 /// Wrapper for [`File::sync_data`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.sync_data).
62 pub fn sync_data(&self) -> Result
<(), io
::Error
> {
65 .map_err(|source
| self.error(source
, ErrorKind
::SyncFile
))
68 /// Wrapper for [`File::set_len`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.set_len).
69 pub fn set_len(&self, size
: u64) -> Result
<(), io
::Error
> {
72 .map_err(|source
| self.error(source
, ErrorKind
::SetLen
))
75 /// Wrapper for [`File::metadata`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.metadata).
76 pub fn metadata(&self) -> Result
<fs
::Metadata
, io
::Error
> {
79 .map_err(|source
| self.error(source
, ErrorKind
::Metadata
))
82 /// Wrapper for [`File::try_clone`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.try_clone).
83 pub fn try_clone(&self) -> Result
<Self, io
::Error
> {
88 path
: self.path
.clone(),
90 .map_err(|source
| self.error(source
, ErrorKind
::Clone
))
93 /// Wrapper for [`File::set_permissions`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.set_permissions).
94 pub fn set_permissions(&self, perm
: fs
::Permissions
) -> Result
<(), io
::Error
> {
96 .set_permissions(perm
)
97 .map_err(|source
| self.error(source
, ErrorKind
::SetPermissions
))
100 /// Creates a [`File`](struct.File.html) from a raw file and its path.
101 pub fn from_parts
<P
>(file
: fs
::File
, path
: P
) -> Self
112 /// Methods added by fs-err that are not available on
113 /// [`std::fs::File`][std::fs::File].
115 /// [std::fs::File]: https://doc.rust-lang.org/stable/std/fs/struct.File.html
117 /// Returns a reference to the underlying [`std::fs::File`][std::fs::File].
119 /// [std::fs::File]: https://doc.rust-lang.org/stable/std/fs/struct.File.html
120 pub fn file(&self) -> &fs
::File
{
124 /// Returns a reference to the path that this file was created with.
125 pub fn path(&self) -> &Path
{
129 /// Wrap the error in information specific to this `File` object.
130 fn error(&self, source
: io
::Error
, kind
: ErrorKind
) -> io
::Error
{
131 Error
::new(source
, kind
, &self.path
)
136 fn read(&mut self, buf
: &mut [u8]) -> std
::io
::Result
<usize> {
139 .map_err(|source
| self.error(source
, ErrorKind
::Read
))
142 fn read_vectored(&mut self, bufs
: &mut [std
::io
::IoSliceMut
<'_
>]) -> std
::io
::Result
<usize> {
145 .map_err(|source
| self.error(source
, ErrorKind
::Read
))
149 impl<'a
> Read
for &'a File
{
150 fn read(&mut self, buf
: &mut [u8]) -> std
::io
::Result
<usize> {
153 .map_err(|source
| self.error(source
, ErrorKind
::Read
))
156 fn read_vectored(&mut self, bufs
: &mut [std
::io
::IoSliceMut
<'_
>]) -> std
::io
::Result
<usize> {
159 .map_err(|source
| self.error(source
, ErrorKind
::Read
))
164 fn seek(&mut self, pos
: std
::io
::SeekFrom
) -> std
::io
::Result
<u64> {
167 .map_err(|source
| self.error(source
, ErrorKind
::Seek
))
171 impl<'a
> Seek
for &'a File
{
172 fn seek(&mut self, pos
: std
::io
::SeekFrom
) -> std
::io
::Result
<u64> {
175 .map_err(|source
| self.error(source
, ErrorKind
::Seek
))
179 impl Write
for File
{
180 fn write(&mut self, buf
: &[u8]) -> std
::io
::Result
<usize> {
183 .map_err(|source
| self.error(source
, ErrorKind
::Write
))
186 fn write_vectored(&mut self, bufs
: &[std
::io
::IoSlice
<'_
>]) -> std
::io
::Result
<usize> {
188 .write_vectored(bufs
)
189 .map_err(|source
| self.error(source
, ErrorKind
::Write
))
192 fn flush(&mut self) -> std
::io
::Result
<()> {
195 .map_err(|source
| self.error(source
, ErrorKind
::Flush
))
199 impl<'a
> Write
for &'a File
{
200 fn write(&mut self, buf
: &[u8]) -> std
::io
::Result
<usize> {
203 .map_err(|source
| self.error(source
, ErrorKind
::Write
))
206 fn write_vectored(&mut self, bufs
: &[std
::io
::IoSlice
<'_
>]) -> std
::io
::Result
<usize> {
208 .write_vectored(bufs
)
209 .map_err(|source
| self.error(source
, ErrorKind
::Write
))
212 fn flush(&mut self) -> std
::io
::Result
<()> {
215 .map_err(|source
| self.error(source
, ErrorKind
::Flush
))