2020-08-27 13:45:01 +00:00
#[ cfg(test) ]
mod tests ;
2021-08-08 12:13:35 +00:00
#[ cfg(target_pointer_width = " 64 " ) ]
mod repr_bitpacked ;
#[ cfg(target_pointer_width = " 64 " ) ]
use repr_bitpacked ::Repr ;
#[ cfg(not(target_pointer_width = " 64 " )) ]
2021-08-08 08:04:33 +00:00
mod repr_unpacked ;
2021-08-08 12:13:35 +00:00
#[ cfg(not(target_pointer_width = " 64 " )) ]
2021-08-08 08:04:33 +00:00
use repr_unpacked ::Repr ;
2019-11-27 18:29:00 +00:00
use crate ::convert ::From ;
2019-02-10 19:23:21 +00:00
use crate ::error ;
use crate ::fmt ;
use crate ::result ;
use crate ::sys ;
2015-02-01 04:24:36 +00:00
2020-08-18 17:36:52 +00:00
/// A specialized [`Result`] type for I/O operations.
2015-07-08 22:31:08 +00:00
///
2017-08-10 21:05:50 +00:00
/// This type is broadly used across [`std::io`] for any operation which may
2015-07-08 22:31:08 +00:00
/// produce an error.
2015-02-01 04:24:36 +00:00
///
2017-08-10 21:05:50 +00:00
/// This typedef is generally used to avoid writing out [`io::Error`] directly and
/// is otherwise a direct mapping to [`Result`].
2015-07-08 22:31:08 +00:00
///
2017-08-10 21:05:50 +00:00
/// While usual Rust style is to import types directly, aliases of [`Result`]
/// often are not, to make it easier to distinguish between them. [`Result`] is
/// generally assumed to be [`std::result::Result`][`Result`], and so users of this alias
2020-08-18 17:36:52 +00:00
/// will generally use `io::Result` instead of shadowing the [prelude]'s import
2017-08-10 21:05:50 +00:00
/// of [`std::result::Result`][`Result`].
///
2020-08-18 17:36:52 +00:00
/// [`std::io`]: crate::io
/// [`io::Error`]: Error
/// [`Result`]: crate::result::Result
/// [prelude]: crate::prelude
2015-07-08 22:31:08 +00:00
///
/// # Examples
///
/// A convenience function that bubbles an `io::Result` to its caller:
///
/// ```
/// use std::io;
///
/// fn get_string() -> io::Result<String> {
/// let mut buffer = String::new();
///
2016-12-28 09:02:35 +00:00
/// io::stdin().read_line(&mut buffer)?;
2015-07-08 22:31:08 +00:00
///
/// Ok(buffer)
/// }
/// ```
std: Stabilize the `io` module
The new `std::io` module has had some time to bake now, and this commit
stabilizes its functionality. There are still portions of the module which
remain unstable, and below contains a summart of the actions taken.
This commit also deprecates the entire contents of the `old_io` module in a
blanket fashion. All APIs should now have a reasonable replacement in the
new I/O modules.
Stable APIs:
* `std::io` (the name)
* `std::io::prelude` (the name)
* `Read`
* `Read::read`
* `Read::{read_to_end, read_to_string}` after being modified to return a `usize`
for the number of bytes read.
* `Write`
* `Write::write`
* `Write::{write_all, write_fmt}`
* `BufRead`
* `BufRead::{fill_buf, consume}`
* `BufRead::{read_line, read_until}` after being modified to return a `usize`
for the number of bytes read.
* `BufReader`
* `BufReader::{new, with_capacity}`
* `BufReader::{get_ref, get_mut, into_inner}`
* `{Read,BufRead} for BufReader`
* `BufWriter`
* `BufWriter::{new, with_capacity}`
* `BufWriter::{get_ref, get_mut, into_inner}`
* `Write for BufWriter`
* `IntoInnerError`
* `IntoInnerError::{error, into_inner}`
* `{Error,Display} for IntoInnerError`
* `LineWriter`
* `LineWriter::{new, with_capacity}` - `with_capacity` was added
* `LineWriter::{get_ref, get_mut, into_inner}` - `get_mut` was added)
* `Write for LineWriter`
* `BufStream`
* `BufStream::{new, with_capacities}`
* `BufStream::{get_ref, get_mut, into_inner}`
* `{BufRead,Read,Write} for BufStream`
* `stdin`
* `Stdin`
* `Stdin::lock`
* `Stdin::read_line` - added method
* `StdinLock`
* `Read for Stdin`
* `{Read,BufRead} for StdinLock`
* `stdout`
* `Stdout`
* `Stdout::lock`
* `StdoutLock`
* `Write for Stdout`
* `Write for StdoutLock`
* `stderr`
* `Stderr`
* `Stderr::lock`
* `StderrLock`
* `Write for Stderr`
* `Write for StderrLock`
* `io::Result`
* `io::Error`
* `io::Error::last_os_error`
* `{Display, Error} for Error`
Unstable APIs:
(reasons can be found in the commit itself)
* `Write::flush`
* `Seek`
* `ErrorKind`
* `Error::new`
* `Error::from_os_error`
* `Error::kind`
Deprecated APIs
* `Error::description` - available via the `Error` trait
* `Error::detail` - available via the `Display` implementation
* `thread::Builder::{stdout, stderr}`
Changes in functionality:
* `old_io::stdio::set_stderr` is now a noop as the infrastructure for printing
backtraces has migrated to `std::io`.
* The `ReadExt`, `WriteExt`, and `BufReadExt` extension traits were all removed
by folding functionality into the corresponding trait.
[breaking-change]
2015-03-11 21:16:46 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
pub type Result < T > = result ::Result < T , Error > ;
2017-08-10 21:14:49 +00:00
/// The error type for I/O operations of the [`Read`], [`Write`], [`Seek`], and
2015-02-01 04:24:36 +00:00
/// associated traits.
///
/// Errors mostly originate from the underlying OS, but custom instances of
/// `Error` can be created with crafted error messages and a particular value of
2016-07-30 11:37:52 +00:00
/// [`ErrorKind`].
///
2020-08-18 17:36:52 +00:00
/// [`Read`]: crate::io::Read
/// [`Write`]: crate::io::Write
/// [`Seek`]: crate::io::Seek
std: Stabilize the `io` module
The new `std::io` module has had some time to bake now, and this commit
stabilizes its functionality. There are still portions of the module which
remain unstable, and below contains a summart of the actions taken.
This commit also deprecates the entire contents of the `old_io` module in a
blanket fashion. All APIs should now have a reasonable replacement in the
new I/O modules.
Stable APIs:
* `std::io` (the name)
* `std::io::prelude` (the name)
* `Read`
* `Read::read`
* `Read::{read_to_end, read_to_string}` after being modified to return a `usize`
for the number of bytes read.
* `Write`
* `Write::write`
* `Write::{write_all, write_fmt}`
* `BufRead`
* `BufRead::{fill_buf, consume}`
* `BufRead::{read_line, read_until}` after being modified to return a `usize`
for the number of bytes read.
* `BufReader`
* `BufReader::{new, with_capacity}`
* `BufReader::{get_ref, get_mut, into_inner}`
* `{Read,BufRead} for BufReader`
* `BufWriter`
* `BufWriter::{new, with_capacity}`
* `BufWriter::{get_ref, get_mut, into_inner}`
* `Write for BufWriter`
* `IntoInnerError`
* `IntoInnerError::{error, into_inner}`
* `{Error,Display} for IntoInnerError`
* `LineWriter`
* `LineWriter::{new, with_capacity}` - `with_capacity` was added
* `LineWriter::{get_ref, get_mut, into_inner}` - `get_mut` was added)
* `Write for LineWriter`
* `BufStream`
* `BufStream::{new, with_capacities}`
* `BufStream::{get_ref, get_mut, into_inner}`
* `{BufRead,Read,Write} for BufStream`
* `stdin`
* `Stdin`
* `Stdin::lock`
* `Stdin::read_line` - added method
* `StdinLock`
* `Read for Stdin`
* `{Read,BufRead} for StdinLock`
* `stdout`
* `Stdout`
* `Stdout::lock`
* `StdoutLock`
* `Write for Stdout`
* `Write for StdoutLock`
* `stderr`
* `Stderr`
* `Stderr::lock`
* `StderrLock`
* `Write for Stderr`
* `Write for StderrLock`
* `io::Result`
* `io::Error`
* `io::Error::last_os_error`
* `{Display, Error} for Error`
Unstable APIs:
(reasons can be found in the commit itself)
* `Write::flush`
* `Seek`
* `ErrorKind`
* `Error::new`
* `Error::from_os_error`
* `Error::kind`
Deprecated APIs
* `Error::description` - available via the `Error` trait
* `Error::detail` - available via the `Display` implementation
* `thread::Builder::{stdout, stderr}`
Changes in functionality:
* `old_io::stdio::set_stderr` is now a noop as the infrastructure for printing
backtraces has migrated to `std::io`.
* The `ReadExt`, `WriteExt`, and `BufReadExt` extension traits were all removed
by folding functionality into the corresponding trait.
[breaking-change]
2015-03-11 21:16:46 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
pub struct Error {
repr : Repr ,
}
2018-01-02 02:56:22 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
impl fmt ::Debug for Error {
2019-03-01 08:34:11 +00:00
fn fmt ( & self , f : & mut fmt ::Formatter < '_ > ) -> fmt ::Result {
2018-01-02 02:56:22 +00:00
fmt ::Debug ::fmt ( & self . repr , f )
}
}
2022-02-05 06:38:29 +00:00
// Only derive debug in tests, to make sure it
// doesn't accidentally get printed.
#[ cfg_attr(test, derive(Debug)) ]
2021-08-08 08:04:33 +00:00
enum ErrorData < C > {
2015-02-01 04:24:36 +00:00
Os ( i32 ) ,
2016-11-02 01:19:33 +00:00
Simple ( ErrorKind ) ,
2021-08-08 08:04:33 +00:00
SimpleMessage ( & 'static SimpleMessage ) ,
Custom ( C ) ,
}
2021-08-09 09:19:28 +00:00
// `#[repr(align(4))]` is probably redundant, it should have that value or
// higher already. We include it just because repr_bitpacked.rs's encoding
// requires an alignment >= 4 (note that `#[repr(align)]` will not reduce the
// alignment required by the struct, only increase it).
2022-01-31 20:43:15 +00:00
//
// If we add more variants to ErrorData, this can be increased to 8, but it
// should probably be behind `#[cfg_attr(target_pointer_width = "64", ...)]` or
// whatever cfg we're using to enable the `repr_bitpacked` code, since only the
// that version needs the alignment, and 8 is higher than the alignment we'll
// have on 32 bit platforms.
//
// (For the sake of being explicit: the alignment requirement here only matters
// if `error/repr_bitpacked.rs` is in use — for the unpacked repr it doesn't
// matter at all)
2021-08-08 08:04:33 +00:00
#[ repr(align(4)) ]
2022-02-05 06:38:29 +00:00
#[ derive(Debug) ]
2021-08-08 08:04:33 +00:00
pub ( crate ) struct SimpleMessage {
kind : ErrorKind ,
message : & 'static str ,
}
impl SimpleMessage {
pub ( crate ) const fn new ( kind : ErrorKind , message : & 'static str ) -> Self {
Self { kind , message }
}
}
/// Create and return an `io::Error` for a given `ErrorKind` and constant
/// message. This doesn't allocate.
pub ( crate ) macro const_io_error ( $kind :expr , $message :expr $(, ) ? ) {
$crate ::io ::error ::Error ::from_static_message ( {
const MESSAGE_DATA : $crate ::io ::error ::SimpleMessage =
$crate ::io ::error ::SimpleMessage ::new ( $kind , $message ) ;
& MESSAGE_DATA
} )
2015-02-01 04:24:36 +00:00
}
2021-08-09 09:19:28 +00:00
// As with `SimpleMessage`: `#[repr(align(4))]` here is just because
// repr_bitpacked's encoding requires it. In practice it almost certainly be
// already be this high or higher.
2015-03-31 23:01:03 +00:00
#[ derive(Debug) ]
2021-08-08 08:04:33 +00:00
#[ repr(align(4)) ]
2015-02-01 04:24:36 +00:00
struct Custom {
kind : ErrorKind ,
2019-11-27 18:29:00 +00:00
error : Box < dyn error ::Error + Send + Sync > ,
2015-02-01 04:24:36 +00:00
}
/// A list specifying general categories of I/O error.
2015-03-17 01:08:57 +00:00
///
/// This list is intended to grow over time and it is not recommended to
/// exhaustively match against it.
2016-07-30 11:37:52 +00:00
///
/// It is used with the [`io::Error`] type.
///
2020-08-18 17:36:52 +00:00
/// [`io::Error`]: Error
2022-02-23 02:22:23 +00:00
///
/// # Handling errors and matching on `ErrorKind`
///
/// In application code, use `match` for the `ErrorKind` values you are expecting; use `_` to match
/// "all other errors".
///
2022-02-23 02:29:02 +00:00
/// In comprehensive and thorough tests that want to verify that a test doesn't return any known incorrect error kind,
2022-02-23 22:18:42 +00:00
/// you may want to cut-and-paste the current full list of errors from here into your test code, and then match `_` as the correct case. This seems counterintuitive,
2022-02-23 02:28:27 +00:00
/// but it will make your tests more robust. In particular, if you want to verify that your code does produce an
/// unrecognized error kind, the robust solution is to check for all the recognized error kinds and fail in those cases.
2016-08-23 00:07:50 +00:00
#[ derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd) ]
2015-03-17 01:08:57 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-12-03 01:31:49 +00:00
#[ allow(deprecated) ]
2018-08-15 15:57:06 +00:00
#[ non_exhaustive ]
2015-02-01 04:24:36 +00:00
pub enum ErrorKind {
2015-03-17 01:08:57 +00:00
/// An entity was not found, often a file.
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
NotFound ,
/// The operation lacked the necessary privileges to complete.
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
PermissionDenied ,
/// The connection was refused by the remote server.
2015-03-17 01:08:57 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
ConnectionRefused ,
/// The connection was reset by the remote server.
2015-03-17 01:08:57 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
ConnectionReset ,
2021-04-30 16:05:01 +00:00
/// The remote host is not reachable.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
HostUnreachable ,
/// The network containing the remote host is not reachable.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
NetworkUnreachable ,
2015-02-01 04:24:36 +00:00
/// The connection was aborted (terminated) by the remote server.
2015-03-17 01:08:57 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
ConnectionAborted ,
/// The network operation failed because it was not connected yet.
2015-03-17 01:08:57 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
NotConnected ,
2015-03-17 01:08:57 +00:00
/// A socket address could not be bound because the address is already in
/// use elsewhere.
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
AddrInUse ,
/// A nonexistent interface was requested or the requested address was not
/// local.
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
AddrNotAvailable ,
2021-04-30 16:05:01 +00:00
/// The system's networking is down.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
NetworkDown ,
2015-02-01 04:24:36 +00:00
/// The operation failed because a pipe was closed.
2015-03-17 01:08:57 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
BrokenPipe ,
2015-03-17 01:08:57 +00:00
/// An entity already exists, often a file.
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
AlreadyExists ,
/// The operation needs to block to complete, but the blocking operation was
/// requested to not occur.
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
WouldBlock ,
2021-04-30 16:05:01 +00:00
/// A filesystem object is, unexpectedly, not a directory.
///
/// For example, a filesystem path was specified where one of the intermediate directory
/// components was, in fact, a plain file.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
NotADirectory ,
/// The filesystem object is, unexpectedly, a directory.
///
/// A directory was specified when a non-directory was expected.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
IsADirectory ,
/// A non-empty directory was specified where an empty directory was expected.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
DirectoryNotEmpty ,
/// The filesystem or storage medium is read-only, but a write operation was attempted.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
ReadOnlyFilesystem ,
2021-06-20 16:05:03 +00:00
/// Loop in the filesystem or IO subsystem; often, too many levels of symbolic links.
2021-04-30 16:05:01 +00:00
///
2021-06-20 16:05:03 +00:00
/// There was a loop (or excessively long chain) resolving a filesystem object
/// or file IO object.
2021-04-30 16:05:01 +00:00
///
/// On Unix this is usually the result of a symbolic link loop; or, of exceeding the
/// system-specific limit on the depth of symlink traversal.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
FilesystemLoop ,
2021-06-20 16:16:24 +00:00
/// Stale network file handle.
2021-04-30 16:05:01 +00:00
///
/// With some network filesystems, notably NFS, an open file (or directory) can be invalidated
/// by problems with the network or server.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
StaleNetworkFileHandle ,
2015-03-17 01:08:57 +00:00
/// A parameter was incorrect.
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
InvalidInput ,
2015-05-09 15:57:26 +00:00
/// Data not valid for the operation were encountered.
///
2016-11-02 18:08:10 +00:00
/// Unlike [`InvalidInput`], this typically means that the operation
2015-05-09 15:57:26 +00:00
/// parameters were valid, however the error was caused by malformed
/// input data.
2015-08-18 17:53:32 +00:00
///
/// For example, a function that reads a file into a string will error with
/// `InvalidData` if the file's contents are not valid UTF-8.
2016-11-02 18:08:10 +00:00
///
2020-08-18 17:36:52 +00:00
/// [`InvalidInput`]: ErrorKind::InvalidInput
2015-05-30 12:09:13 +00:00
#[ stable(feature = " io_invalid_data " , since = " 1.2.0 " ) ]
2015-05-09 15:57:26 +00:00
InvalidData ,
2015-02-01 04:24:36 +00:00
/// The I/O operation's timeout expired, causing it to be canceled.
2015-03-17 01:08:57 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
TimedOut ,
/// An error returned when an operation could not be completed because a
2017-03-12 18:04:52 +00:00
/// call to [`write`] returned [`Ok(0)`].
2015-02-01 04:24:36 +00:00
///
/// This typically means that an operation could only succeed if it wrote a
/// particular number of bytes but only a smaller number of bytes could be
/// written.
2016-11-02 18:08:10 +00:00
///
2020-08-18 17:36:52 +00:00
/// [`write`]: crate::io::Write::write
/// [`Ok(0)`]: Ok
2015-03-17 01:08:57 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
WriteZero ,
2021-04-30 16:05:01 +00:00
/// The underlying storage (typically, a filesystem) is full.
///
/// This does not include out of quota errors.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
StorageFull ,
2021-06-20 16:16:24 +00:00
/// Seek on unseekable file.
2021-04-30 16:05:01 +00:00
///
/// Seeking was attempted on an open file handle which is not suitable for seeking - for
2021-06-18 18:38:10 +00:00
/// example, on Unix, a named pipe opened with `File::open`.
2021-04-30 16:05:01 +00:00
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
NotSeekable ,
/// Filesystem quota was exceeded.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
FilesystemQuotaExceeded ,
/// File larger than allowed or supported.
///
/// This might arise from a hard limit of the underlying filesystem or file access API, or from
/// an administratively imposed resource limitation. Simple disk full, and out of quota, have
/// their own errors.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
FileTooLarge ,
/// Resource is busy.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
ResourceBusy ,
/// Executable file is busy.
///
/// An attempt was made to write to a file which is also in use as a running program. (Not all
/// operating systems detect this situation.)
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
ExecutableFileBusy ,
2021-06-20 16:16:24 +00:00
/// Deadlock (avoided).
2021-04-30 16:05:01 +00:00
///
/// A file locking operation would result in deadlock. This situation is typically detected, if
/// at all, on a best-effort basis.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
Deadlock ,
/// Cross-device or cross-filesystem (hard) link or rename.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
CrossesDevices ,
/// Too many (hard) links to the same filesystem object.
///
/// The filesystem does not support making so many hardlinks to the same file.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
TooManyLinks ,
2022-02-10 14:49:27 +00:00
/// A filename was invalid.
2021-04-30 16:05:01 +00:00
///
2022-02-10 14:49:27 +00:00
/// This error can also cause if it exceeded the filename length limit.
2021-04-30 16:05:01 +00:00
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
2022-02-10 14:49:27 +00:00
InvalidFilename ,
2021-04-30 16:05:01 +00:00
/// Program argument list too long.
///
/// When trying to run an external program, a system or process limit on the size of the
/// arguments would have been exceeded.
#[ unstable(feature = " io_error_more " , issue = " 86442 " ) ]
ArgumentListTooLong ,
2015-03-17 01:08:57 +00:00
/// This operation was interrupted.
///
/// Interrupted operations can typically be retried.
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
Interrupted ,
2015-03-17 01:08:57 +00:00
2021-08-24 15:53:58 +00:00
/// This operation is unsupported on this platform.
2021-05-27 12:03:35 +00:00
///
2021-08-24 15:53:58 +00:00
/// This means that the operation can never succeed.
#[ stable(feature = " unsupported_error " , since = " 1.53.0 " ) ]
Unsupported ,
// ErrorKinds which are primarily categorisations for OS error
// codes should be added above.
2021-08-24 16:44:16 +00:00
//
2021-06-25 19:04:08 +00:00
/// An error returned when an operation could not be completed because an
/// "end of file" was reached prematurely.
///
/// This typically means that an operation could only succeed if it read a
/// particular number of bytes but only a smaller number of bytes could be
/// read.
#[ stable(feature = " read_exact " , since = " 1.6.0 " ) ]
UnexpectedEof ,
2021-04-30 11:15:38 +00:00
/// An operation could not be completed, because it failed
/// to allocate enough memory.
2021-05-03 09:28:19 +00:00
#[ stable(feature = " out_of_memory_error " , since = " 1.54.0 " ) ]
2021-04-30 11:15:38 +00:00
OutOfMemory ,
2021-05-27 12:03:35 +00:00
2021-08-24 15:53:58 +00:00
// "Unusual" error kinds which do not correspond simply to (sets
// of) OS error codes, should be added just above this comment.
// `Other` and `Uncategorised` should remain at the end:
2021-08-24 16:44:16 +00:00
//
2021-08-24 15:53:58 +00:00
/// A custom error that does not fall under any other I/O error kind.
///
/// This can be used to construct your own [`Error`]s that do not match any
/// [`ErrorKind`].
///
/// This [`ErrorKind`] is not used by the standard library.
///
/// Errors from the standard library that do not fall under any of the I/O
/// error kinds cannot be `match`ed on, and will only match a wildcard (`_`) pattern.
/// New [`ErrorKind`]s might be added in the future for some of those.
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
Other ,
2021-05-27 12:03:35 +00:00
/// Any I/O error from the standard library that's not part of this list.
///
2021-06-15 12:27:31 +00:00
/// Errors that are `Uncategorized` now may move to a different or a new
2021-05-27 12:03:35 +00:00
/// [`ErrorKind`] variant in the future. It is not recommended to match
2021-06-15 12:27:31 +00:00
/// an error against `Uncategorized`; use a wildcard match (`_`) instead.
#[ unstable(feature = " io_error_uncategorized " , issue = " none " ) ]
2021-05-27 12:03:35 +00:00
#[ doc(hidden) ]
2021-06-15 12:27:31 +00:00
Uncategorized ,
2015-02-01 04:24:36 +00:00
}
2016-11-02 01:19:33 +00:00
impl ErrorKind {
2018-08-28 04:33:26 +00:00
pub ( crate ) fn as_str ( & self ) -> & 'static str {
2020-12-12 14:38:07 +00:00
use ErrorKind ::* ;
2021-08-24 15:51:58 +00:00
// Strictly alphabetical, please. (Sadly rustfmt cannot do this yet.)
2016-11-02 01:19:33 +00:00
match * self {
2020-12-12 14:38:07 +00:00
AddrInUse = > " address in use " ,
AddrNotAvailable = > " address not available " ,
AlreadyExists = > " entity already exists " ,
2021-04-30 16:05:01 +00:00
ArgumentListTooLong = > " argument list too long " ,
2020-12-12 14:38:07 +00:00
BrokenPipe = > " broken pipe " ,
ConnectionAborted = > " connection aborted " ,
ConnectionRefused = > " connection refused " ,
ConnectionReset = > " connection reset " ,
2021-04-30 16:05:01 +00:00
CrossesDevices = > " cross-device link or rename " ,
Deadlock = > " deadlock " ,
DirectoryNotEmpty = > " directory not empty " ,
ExecutableFileBusy = > " executable file busy " ,
2021-08-24 15:51:58 +00:00
FileTooLarge = > " file too large " ,
FilesystemLoop = > " filesystem loop or indirection limit (e.g. symlink loop) " ,
2021-04-30 16:05:01 +00:00
FilesystemQuotaExceeded = > " filesystem quota exceeded " ,
HostUnreachable = > " host unreachable " ,
2020-12-12 14:38:07 +00:00
Interrupted = > " operation interrupted " ,
InvalidData = > " invalid data " ,
2022-02-10 14:49:27 +00:00
InvalidFilename = > " invalid filename " ,
2020-12-12 14:38:07 +00:00
InvalidInput = > " invalid input parameter " ,
2021-04-30 16:05:01 +00:00
IsADirectory = > " is a directory " ,
NetworkDown = > " network down " ,
NetworkUnreachable = > " network unreachable " ,
NotADirectory = > " not a directory " ,
2020-12-12 14:38:07 +00:00
NotConnected = > " not connected " ,
NotFound = > " entity not found " ,
2021-08-24 15:51:58 +00:00
NotSeekable = > " seek on unseekable file " ,
2020-12-12 14:38:07 +00:00
Other = > " other error " ,
OutOfMemory = > " out of memory " ,
PermissionDenied = > " permission denied " ,
2021-04-30 16:05:01 +00:00
ReadOnlyFilesystem = > " read-only filesystem or storage medium " ,
2021-08-24 15:51:58 +00:00
ResourceBusy = > " resource busy " ,
2021-04-30 16:05:01 +00:00
StaleNetworkFileHandle = > " stale network file handle " ,
2021-08-24 15:51:58 +00:00
StorageFull = > " no storage space " ,
2020-12-12 14:38:07 +00:00
TimedOut = > " timed out " ,
2021-04-30 16:05:01 +00:00
TooManyLinks = > " too many links " ,
2020-12-12 14:38:07 +00:00
Uncategorized = > " uncategorized error " ,
UnexpectedEof = > " unexpected end of file " ,
Unsupported = > " unsupported " ,
WouldBlock = > " operation would block " ,
WriteZero = > " write zero " ,
2016-11-02 01:19:33 +00:00
}
}
}
2022-01-19 19:43:27 +00:00
#[ stable(feature = " io_errorkind_display " , since = " 1.60.0 " ) ]
impl fmt ::Display for ErrorKind {
/// Shows a human-readable description of the `ErrorKind`.
///
/// This is similar to `impl Display for Error`, but doesn't require first converting to Error.
///
/// # Examples
/// ```
/// use std::io::ErrorKind;
/// assert_eq!("entity not found", ErrorKind::NotFound.to_string());
/// ```
fn fmt ( & self , fmt : & mut fmt ::Formatter < '_ > ) -> fmt ::Result {
fmt . write_str ( self . as_str ( ) )
}
}
2016-11-02 01:19:33 +00:00
/// Intended for use for errors not exposed to the user, where allocating onto
/// the heap (for normal construction via Error::new) is too costly.
#[ stable(feature = " io_error_from_errorkind " , since = " 1.14.0 " ) ]
impl From < ErrorKind > for Error {
2018-10-06 15:21:53 +00:00
/// Converts an [`ErrorKind`] into an [`Error`].
2018-08-20 02:04:08 +00:00
///
2022-01-19 19:43:27 +00:00
/// This conversion creates a new error with a simple representation of error kind.
2018-08-20 02:04:08 +00:00
///
2018-09-26 19:34:12 +00:00
/// # Examples
///
/// ```
/// use std::io::{Error, ErrorKind};
///
2018-10-02 22:25:31 +00:00
/// let not_found = ErrorKind::NotFound;
/// let error = Error::from(not_found);
/// assert_eq!("entity not found", format!("{}", error));
2018-09-26 19:34:12 +00:00
/// ```
2017-06-04 17:45:44 +00:00
#[ inline ]
2016-11-02 01:19:33 +00:00
fn from ( kind : ErrorKind ) -> Error {
2021-08-08 08:04:33 +00:00
Error { repr : Repr ::new_simple ( kind ) }
2016-11-02 01:19:33 +00:00
}
}
2015-02-01 04:24:36 +00:00
impl Error {
2015-03-31 23:01:03 +00:00
/// Creates a new I/O error from a known kind of error as well as an
/// arbitrary error payload.
///
/// This function is used to generically create I/O errors which do not
/// originate from the OS itself. The `error` argument is an arbitrary
2020-08-18 17:36:52 +00:00
/// payload which will be contained in this [`Error`].
2015-03-31 23:01:03 +00:00
///
2021-11-21 08:00:13 +00:00
/// If no extra payload is required, use the `From` conversion from
/// `ErrorKind`.
///
2015-03-31 23:01:03 +00:00
/// # Examples
///
/// ```
/// use std::io::{Error, ErrorKind};
///
/// // errors can be created from strings
/// let custom_error = Error::new(ErrorKind::Other, "oh no!");
///
/// // errors can also be created from other errors
/// let custom_error2 = Error::new(ErrorKind::Interrupted, custom_error);
2021-11-21 08:00:13 +00:00
///
/// // creating an error without payload
/// let eof_error = Error::from(ErrorKind::UnexpectedEof);
2015-03-31 23:01:03 +00:00
/// ```
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
pub fn new < E > ( kind : ErrorKind , error : E ) -> Error
2019-11-27 18:29:00 +00:00
where
E : Into < Box < dyn error ::Error + Send + Sync > > ,
2015-03-31 23:01:03 +00:00
{
2015-09-09 19:37:59 +00:00
Self ::_new ( kind , error . into ( ) )
}
2021-12-15 01:00:59 +00:00
/// Creates a new I/O error from an arbitrary error payload.
///
/// This function is used to generically create I/O errors which do not
/// originate from the OS itself. It is a shortcut for [`Error::new`]
/// with [`ErrorKind::Other`].
///
/// # Examples
///
/// ```
/// #![feature(io_error_other)]
///
/// use std::io::Error;
///
/// // errors can be created from strings
/// let custom_error = Error::other("oh no!");
///
/// // errors can also be created from other errors
/// let custom_error2 = Error::other(custom_error);
/// ```
#[ unstable(feature = " io_error_other " , issue = " 91946 " ) ]
pub fn other < E > ( error : E ) -> Error
where
E : Into < Box < dyn error ::Error + Send + Sync > > ,
{
Self ::_new ( ErrorKind ::Other , error . into ( ) )
}
2019-11-27 18:29:00 +00:00
fn _new ( kind : ErrorKind , error : Box < dyn error ::Error + Send + Sync > ) -> Error {
2021-08-08 08:04:33 +00:00
Error { repr : Repr ::new_custom ( Box ::new ( Custom { kind , error } ) ) }
2015-02-01 04:24:36 +00:00
}
2021-08-08 08:04:33 +00:00
/// Creates a new I/O error from a known kind of error as well as a constant
/// message.
2021-03-21 19:21:51 +00:00
///
2021-03-21 20:44:25 +00:00
/// This function does not allocate.
2021-03-21 19:21:51 +00:00
///
2021-08-08 08:04:33 +00:00
/// You should not use this directly, and instead use the `const_io_error!`
/// macro: `io::const_io_error!(ErrorKind::Something, "some_message")`.
///
/// This function should maybe change to `from_static_message<const MSG: &'static
/// str>(kind: ErrorKind)` in the future, when const generics allow that.
2021-03-27 11:13:32 +00:00
#[ inline ]
2021-08-08 08:04:33 +00:00
pub ( crate ) const fn from_static_message ( msg : & 'static SimpleMessage ) -> Error {
Self { repr : Repr ::new_simple_message ( msg ) }
2021-03-21 19:21:51 +00:00
}
2015-02-01 04:24:36 +00:00
/// Returns an error representing the last OS error which occurred.
///
/// This function reads the value of `errno` for the target platform (e.g.
/// `GetLastError` on Windows) and will return a corresponding instance of
2020-08-18 17:36:52 +00:00
/// [`Error`] for the error code.
2016-07-29 12:32:35 +00:00
///
2021-12-02 17:51:44 +00:00
/// This should be called immediately after a call to a platform function,
/// otherwise the state of the error value is indeterminate. In particular,
/// other standard library functions may call platform functions that may
/// (or may not) reset the error value even if they succeed.
///
2016-07-29 12:32:35 +00:00
/// # Examples
///
/// ```
/// use std::io::Error;
///
2021-12-02 17:51:44 +00:00
/// let os_error = Error::last_os_error();
/// println!("last OS error: {:?}", os_error);
2016-07-29 12:32:35 +00:00
/// ```
std: Stabilize the `io` module
The new `std::io` module has had some time to bake now, and this commit
stabilizes its functionality. There are still portions of the module which
remain unstable, and below contains a summart of the actions taken.
This commit also deprecates the entire contents of the `old_io` module in a
blanket fashion. All APIs should now have a reasonable replacement in the
new I/O modules.
Stable APIs:
* `std::io` (the name)
* `std::io::prelude` (the name)
* `Read`
* `Read::read`
* `Read::{read_to_end, read_to_string}` after being modified to return a `usize`
for the number of bytes read.
* `Write`
* `Write::write`
* `Write::{write_all, write_fmt}`
* `BufRead`
* `BufRead::{fill_buf, consume}`
* `BufRead::{read_line, read_until}` after being modified to return a `usize`
for the number of bytes read.
* `BufReader`
* `BufReader::{new, with_capacity}`
* `BufReader::{get_ref, get_mut, into_inner}`
* `{Read,BufRead} for BufReader`
* `BufWriter`
* `BufWriter::{new, with_capacity}`
* `BufWriter::{get_ref, get_mut, into_inner}`
* `Write for BufWriter`
* `IntoInnerError`
* `IntoInnerError::{error, into_inner}`
* `{Error,Display} for IntoInnerError`
* `LineWriter`
* `LineWriter::{new, with_capacity}` - `with_capacity` was added
* `LineWriter::{get_ref, get_mut, into_inner}` - `get_mut` was added)
* `Write for LineWriter`
* `BufStream`
* `BufStream::{new, with_capacities}`
* `BufStream::{get_ref, get_mut, into_inner}`
* `{BufRead,Read,Write} for BufStream`
* `stdin`
* `Stdin`
* `Stdin::lock`
* `Stdin::read_line` - added method
* `StdinLock`
* `Read for Stdin`
* `{Read,BufRead} for StdinLock`
* `stdout`
* `Stdout`
* `Stdout::lock`
* `StdoutLock`
* `Write for Stdout`
* `Write for StdoutLock`
* `stderr`
* `Stderr`
* `Stderr::lock`
* `StderrLock`
* `Write for Stderr`
* `Write for StderrLock`
* `io::Result`
* `io::Error`
* `io::Error::last_os_error`
* `{Display, Error} for Error`
Unstable APIs:
(reasons can be found in the commit itself)
* `Write::flush`
* `Seek`
* `ErrorKind`
* `Error::new`
* `Error::from_os_error`
* `Error::kind`
Deprecated APIs
* `Error::description` - available via the `Error` trait
* `Error::detail` - available via the `Display` implementation
* `thread::Builder::{stdout, stderr}`
Changes in functionality:
* `old_io::stdio::set_stderr` is now a noop as the infrastructure for printing
backtraces has migrated to `std::io`.
* The `ReadExt`, `WriteExt`, and `BufReadExt` extension traits were all removed
by folding functionality into the corresponding trait.
[breaking-change]
2015-03-11 21:16:46 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2021-10-31 02:58:27 +00:00
#[ must_use ]
2021-03-27 11:13:32 +00:00
#[ inline ]
2015-02-01 04:24:36 +00:00
pub fn last_os_error ( ) -> Error {
2015-04-08 23:41:14 +00:00
Error ::from_raw_os_error ( sys ::os ::errno ( ) as i32 )
2015-02-01 04:24:36 +00:00
}
2020-08-18 17:36:52 +00:00
/// Creates a new instance of an [`Error`] from a particular OS error code.
2016-07-02 13:50:19 +00:00
///
/// # Examples
///
/// On Linux:
///
/// ```
/// # if cfg!(target_os = "linux") {
/// use std::io;
///
2018-01-23 14:47:30 +00:00
/// let error = io::Error::from_raw_os_error(22);
/// assert_eq!(error.kind(), io::ErrorKind::InvalidInput);
2016-07-02 13:50:19 +00:00
/// # }
/// ```
///
/// On Windows:
///
/// ```
/// # if cfg!(windows) {
/// use std::io;
///
2018-01-23 14:47:30 +00:00
/// let error = io::Error::from_raw_os_error(10022);
/// assert_eq!(error.kind(), io::ErrorKind::InvalidInput);
2016-07-02 13:50:19 +00:00
/// # }
/// ```
2015-04-08 23:41:14 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2021-10-10 22:22:40 +00:00
#[ must_use ]
2021-03-27 11:13:32 +00:00
#[ inline ]
2015-04-08 23:41:14 +00:00
pub fn from_raw_os_error ( code : i32 ) -> Error {
2021-08-08 08:04:33 +00:00
Error { repr : Repr ::new_os ( code ) }
2015-04-08 23:41:14 +00:00
}
2015-03-17 01:08:57 +00:00
/// Returns the OS error that this error represents (if any).
///
2020-08-18 17:36:52 +00:00
/// If this [`Error`] was constructed via [`last_os_error`] or
/// [`from_raw_os_error`], then this function will return [`Some`], otherwise
/// it will return [`None`].
///
/// [`last_os_error`]: Error::last_os_error
/// [`from_raw_os_error`]: Error::from_raw_os_error
2016-07-29 12:32:35 +00:00
///
/// # Examples
///
/// ```
/// use std::io::{Error, ErrorKind};
///
/// fn print_os_error(err: &Error) {
/// if let Some(raw_os_err) = err.raw_os_error() {
/// println!("raw OS error: {:?}", raw_os_err);
/// } else {
/// println!("Not an OS error");
/// }
/// }
///
/// fn main() {
/// // Will print "raw OS error: ...".
/// print_os_error(&Error::last_os_error());
/// // Will print "Not an OS error".
/// print_os_error(&Error::new(ErrorKind::Other, "oh no!"));
/// }
/// ```
2015-03-31 23:01:03 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2021-10-31 02:58:27 +00:00
#[ must_use ]
2021-03-27 11:13:32 +00:00
#[ inline ]
2015-03-17 01:08:57 +00:00
pub fn raw_os_error ( & self ) -> Option < i32 > {
2021-08-08 08:04:33 +00:00
match self . repr . data ( ) {
ErrorData ::Os ( i ) = > Some ( i ) ,
ErrorData ::Custom ( .. ) = > None ,
ErrorData ::Simple ( .. ) = > None ,
ErrorData ::SimpleMessage ( .. ) = > None ,
2015-03-17 01:08:57 +00:00
}
}
2015-05-27 04:06:56 +00:00
/// Returns a reference to the inner error wrapped by this error (if any).
///
2020-08-18 17:36:52 +00:00
/// If this [`Error`] was constructed via [`new`] then this function will
/// return [`Some`], otherwise it will return [`None`].
///
/// [`new`]: Error::new
2016-07-29 12:32:35 +00:00
///
/// # Examples
///
/// ```
/// use std::io::{Error, ErrorKind};
///
/// fn print_error(err: &Error) {
/// if let Some(inner_err) = err.get_ref() {
/// println!("Inner error: {:?}", inner_err);
/// } else {
/// println!("No inner error");
/// }
/// }
///
/// fn main() {
/// // Will print "No inner error".
/// print_error(&Error::last_os_error());
/// // Will print "Inner error: ...".
/// print_error(&Error::new(ErrorKind::Other, "oh no!"));
/// }
/// ```
2015-07-28 22:44:30 +00:00
#[ stable(feature = " io_error_inner " , since = " 1.3.0 " ) ]
2021-10-31 02:58:27 +00:00
#[ must_use ]
2021-03-27 11:13:32 +00:00
#[ inline ]
2019-11-27 18:29:00 +00:00
pub fn get_ref ( & self ) -> Option < & ( dyn error ::Error + Send + Sync + 'static ) > {
2021-08-08 08:04:33 +00:00
match self . repr . data ( ) {
ErrorData ::Os ( .. ) = > None ,
ErrorData ::Simple ( .. ) = > None ,
ErrorData ::SimpleMessage ( .. ) = > None ,
ErrorData ::Custom ( c ) = > Some ( & * c . error ) ,
2015-05-27 04:06:56 +00:00
}
}
/// Returns a mutable reference to the inner error wrapped by this error
/// (if any).
///
2020-08-18 17:36:52 +00:00
/// If this [`Error`] was constructed via [`new`] then this function will
/// return [`Some`], otherwise it will return [`None`].
///
/// [`new`]: Error::new
2016-07-29 12:32:35 +00:00
///
/// # Examples
///
/// ```
/// use std::io::{Error, ErrorKind};
/// use std::{error, fmt};
/// use std::fmt::Display;
///
/// #[derive(Debug)]
/// struct MyError {
/// v: String,
/// }
///
/// impl MyError {
/// fn new() -> MyError {
/// MyError {
2017-01-13 00:57:48 +00:00
/// v: "oh no!".to_string()
2016-07-29 12:32:35 +00:00
/// }
/// }
///
/// fn change_message(&mut self, new_message: &str) {
2017-01-13 00:57:48 +00:00
/// self.v = new_message.to_string();
2016-07-29 12:32:35 +00:00
/// }
/// }
///
2019-12-23 15:47:28 +00:00
/// impl error::Error for MyError {}
2016-07-29 12:32:35 +00:00
///
/// impl Display for MyError {
2019-03-01 08:34:11 +00:00
/// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2016-07-29 12:32:35 +00:00
/// write!(f, "MyError: {}", &self.v)
/// }
/// }
///
/// fn change_error(mut err: Error) -> Error {
/// if let Some(inner_err) = err.get_mut() {
/// inner_err.downcast_mut::<MyError>().unwrap().change_message("I've been changed!");
/// }
/// err
/// }
///
/// fn print_error(err: &Error) {
/// if let Some(inner_err) = err.get_ref() {
/// println!("Inner error: {}", inner_err);
/// } else {
/// println!("No inner error");
/// }
/// }
///
/// fn main() {
/// // Will print "No inner error".
/// print_error(&change_error(Error::last_os_error()));
/// // Will print "Inner error: ...".
/// print_error(&change_error(Error::new(ErrorKind::Other, MyError::new())));
/// }
/// ```
2015-07-28 22:44:30 +00:00
#[ stable(feature = " io_error_inner " , since = " 1.3.0 " ) ]
2021-10-31 02:58:27 +00:00
#[ must_use ]
2021-03-27 11:13:32 +00:00
#[ inline ]
2019-11-27 18:29:00 +00:00
pub fn get_mut ( & mut self ) -> Option < & mut ( dyn error ::Error + Send + Sync + 'static ) > {
2021-08-08 08:04:33 +00:00
match self . repr . data_mut ( ) {
ErrorData ::Os ( .. ) = > None ,
ErrorData ::Simple ( .. ) = > None ,
ErrorData ::SimpleMessage ( .. ) = > None ,
ErrorData ::Custom ( c ) = > Some ( & mut * c . error ) ,
2015-05-27 04:06:56 +00:00
}
}
/// Consumes the `Error`, returning its inner error (if any).
///
2020-08-18 17:36:52 +00:00
/// If this [`Error`] was constructed via [`new`] then this function will
/// return [`Some`], otherwise it will return [`None`].
///
/// [`new`]: Error::new
2016-07-29 12:32:35 +00:00
///
/// # Examples
///
/// ```
/// use std::io::{Error, ErrorKind};
///
/// fn print_error(err: Error) {
/// if let Some(inner_err) = err.into_inner() {
/// println!("Inner error: {}", inner_err);
/// } else {
/// println!("No inner error");
/// }
/// }
///
/// fn main() {
/// // Will print "No inner error".
/// print_error(Error::last_os_error());
/// // Will print "Inner error: ...".
/// print_error(Error::new(ErrorKind::Other, "oh no!"));
/// }
/// ```
2015-07-28 22:44:30 +00:00
#[ stable(feature = " io_error_inner " , since = " 1.3.0 " ) ]
2021-10-10 23:50:52 +00:00
#[ must_use = " `self` will be dropped if the result is not used " ]
2021-03-27 11:13:32 +00:00
#[ inline ]
2019-11-27 18:29:00 +00:00
pub fn into_inner ( self ) -> Option < Box < dyn error ::Error + Send + Sync > > {
2021-08-08 08:04:33 +00:00
match self . repr . into_data ( ) {
ErrorData ::Os ( .. ) = > None ,
ErrorData ::Simple ( .. ) = > None ,
ErrorData ::SimpleMessage ( .. ) = > None ,
ErrorData ::Custom ( c ) = > Some ( c . error ) ,
2015-05-27 04:06:56 +00:00
}
}
2020-08-18 17:36:52 +00:00
/// Returns the corresponding [`ErrorKind`] for this error.
2016-07-29 12:32:35 +00:00
///
/// # Examples
///
/// ```
/// use std::io::{Error, ErrorKind};
///
/// fn print_error(err: Error) {
/// println!("{:?}", err.kind());
/// }
///
/// fn main() {
2021-06-15 12:27:31 +00:00
/// // Will print "Uncategorized".
2016-07-29 12:32:35 +00:00
/// print_error(Error::last_os_error());
2020-04-25 04:33:11 +00:00
/// // Will print "AddrInUse".
2016-07-29 12:32:35 +00:00
/// print_error(Error::new(ErrorKind::AddrInUse, "oh no!"));
/// }
/// ```
std: Stabilize the `io` module
The new `std::io` module has had some time to bake now, and this commit
stabilizes its functionality. There are still portions of the module which
remain unstable, and below contains a summart of the actions taken.
This commit also deprecates the entire contents of the `old_io` module in a
blanket fashion. All APIs should now have a reasonable replacement in the
new I/O modules.
Stable APIs:
* `std::io` (the name)
* `std::io::prelude` (the name)
* `Read`
* `Read::read`
* `Read::{read_to_end, read_to_string}` after being modified to return a `usize`
for the number of bytes read.
* `Write`
* `Write::write`
* `Write::{write_all, write_fmt}`
* `BufRead`
* `BufRead::{fill_buf, consume}`
* `BufRead::{read_line, read_until}` after being modified to return a `usize`
for the number of bytes read.
* `BufReader`
* `BufReader::{new, with_capacity}`
* `BufReader::{get_ref, get_mut, into_inner}`
* `{Read,BufRead} for BufReader`
* `BufWriter`
* `BufWriter::{new, with_capacity}`
* `BufWriter::{get_ref, get_mut, into_inner}`
* `Write for BufWriter`
* `IntoInnerError`
* `IntoInnerError::{error, into_inner}`
* `{Error,Display} for IntoInnerError`
* `LineWriter`
* `LineWriter::{new, with_capacity}` - `with_capacity` was added
* `LineWriter::{get_ref, get_mut, into_inner}` - `get_mut` was added)
* `Write for LineWriter`
* `BufStream`
* `BufStream::{new, with_capacities}`
* `BufStream::{get_ref, get_mut, into_inner}`
* `{BufRead,Read,Write} for BufStream`
* `stdin`
* `Stdin`
* `Stdin::lock`
* `Stdin::read_line` - added method
* `StdinLock`
* `Read for Stdin`
* `{Read,BufRead} for StdinLock`
* `stdout`
* `Stdout`
* `Stdout::lock`
* `StdoutLock`
* `Write for Stdout`
* `Write for StdoutLock`
* `stderr`
* `Stderr`
* `Stderr::lock`
* `StderrLock`
* `Write for Stderr`
* `Write for StderrLock`
* `io::Result`
* `io::Error`
* `io::Error::last_os_error`
* `{Display, Error} for Error`
Unstable APIs:
(reasons can be found in the commit itself)
* `Write::flush`
* `Seek`
* `ErrorKind`
* `Error::new`
* `Error::from_os_error`
* `Error::kind`
Deprecated APIs
* `Error::description` - available via the `Error` trait
* `Error::detail` - available via the `Display` implementation
* `thread::Builder::{stdout, stderr}`
Changes in functionality:
* `old_io::stdio::set_stderr` is now a noop as the infrastructure for printing
backtraces has migrated to `std::io`.
* The `ReadExt`, `WriteExt`, and `BufReadExt` extension traits were all removed
by folding functionality into the corresponding trait.
[breaking-change]
2015-03-11 21:16:46 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2021-10-31 02:58:27 +00:00
#[ must_use ]
2021-03-27 11:13:32 +00:00
#[ inline ]
2015-02-01 04:24:36 +00:00
pub fn kind ( & self ) -> ErrorKind {
2021-08-08 08:04:33 +00:00
match self . repr . data ( ) {
ErrorData ::Os ( code ) = > sys ::decode_error_kind ( code ) ,
2021-08-08 12:13:35 +00:00
ErrorData ::Custom ( c ) = > c . kind ,
2021-08-08 08:04:33 +00:00
ErrorData ::Simple ( kind ) = > kind ,
ErrorData ::SimpleMessage ( m ) = > m . kind ,
2015-02-01 04:24:36 +00:00
}
}
}
2015-06-19 02:16:46 +00:00
impl fmt ::Debug for Repr {
2019-03-01 08:34:11 +00:00
fn fmt ( & self , fmt : & mut fmt ::Formatter < '_ > ) -> fmt ::Result {
2021-08-08 08:04:33 +00:00
match self . data ( ) {
ErrorData ::Os ( code ) = > fmt
2019-11-27 18:29:00 +00:00
. debug_struct ( " Os " )
. field ( " code " , & code )
. field ( " kind " , & sys ::decode_error_kind ( code ) )
. field ( " message " , & sys ::os ::error_string ( code ) )
. finish ( ) ,
2021-08-08 08:04:33 +00:00
ErrorData ::Custom ( c ) = > fmt ::Debug ::fmt ( & c , fmt ) ,
ErrorData ::Simple ( kind ) = > fmt . debug_tuple ( " Kind " ) . field ( & kind ) . finish ( ) ,
ErrorData ::SimpleMessage ( msg ) = > fmt
. debug_struct ( " Error " )
. field ( " kind " , & msg . kind )
. field ( " message " , & msg . message )
. finish ( ) ,
2015-06-19 02:16:46 +00:00
}
}
}
std: Stabilize the `io` module
The new `std::io` module has had some time to bake now, and this commit
stabilizes its functionality. There are still portions of the module which
remain unstable, and below contains a summart of the actions taken.
This commit also deprecates the entire contents of the `old_io` module in a
blanket fashion. All APIs should now have a reasonable replacement in the
new I/O modules.
Stable APIs:
* `std::io` (the name)
* `std::io::prelude` (the name)
* `Read`
* `Read::read`
* `Read::{read_to_end, read_to_string}` after being modified to return a `usize`
for the number of bytes read.
* `Write`
* `Write::write`
* `Write::{write_all, write_fmt}`
* `BufRead`
* `BufRead::{fill_buf, consume}`
* `BufRead::{read_line, read_until}` after being modified to return a `usize`
for the number of bytes read.
* `BufReader`
* `BufReader::{new, with_capacity}`
* `BufReader::{get_ref, get_mut, into_inner}`
* `{Read,BufRead} for BufReader`
* `BufWriter`
* `BufWriter::{new, with_capacity}`
* `BufWriter::{get_ref, get_mut, into_inner}`
* `Write for BufWriter`
* `IntoInnerError`
* `IntoInnerError::{error, into_inner}`
* `{Error,Display} for IntoInnerError`
* `LineWriter`
* `LineWriter::{new, with_capacity}` - `with_capacity` was added
* `LineWriter::{get_ref, get_mut, into_inner}` - `get_mut` was added)
* `Write for LineWriter`
* `BufStream`
* `BufStream::{new, with_capacities}`
* `BufStream::{get_ref, get_mut, into_inner}`
* `{BufRead,Read,Write} for BufStream`
* `stdin`
* `Stdin`
* `Stdin::lock`
* `Stdin::read_line` - added method
* `StdinLock`
* `Read for Stdin`
* `{Read,BufRead} for StdinLock`
* `stdout`
* `Stdout`
* `Stdout::lock`
* `StdoutLock`
* `Write for Stdout`
* `Write for StdoutLock`
* `stderr`
* `Stderr`
* `Stderr::lock`
* `StderrLock`
* `Write for Stderr`
* `Write for StderrLock`
* `io::Result`
* `io::Error`
* `io::Error::last_os_error`
* `{Display, Error} for Error`
Unstable APIs:
(reasons can be found in the commit itself)
* `Write::flush`
* `Seek`
* `ErrorKind`
* `Error::new`
* `Error::from_os_error`
* `Error::kind`
Deprecated APIs
* `Error::description` - available via the `Error` trait
* `Error::detail` - available via the `Display` implementation
* `thread::Builder::{stdout, stderr}`
Changes in functionality:
* `old_io::stdio::set_stderr` is now a noop as the infrastructure for printing
backtraces has migrated to `std::io`.
* The `ReadExt`, `WriteExt`, and `BufReadExt` extension traits were all removed
by folding functionality into the corresponding trait.
[breaking-change]
2015-03-11 21:16:46 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
2015-02-01 04:24:36 +00:00
impl fmt ::Display for Error {
2019-03-01 08:34:11 +00:00
fn fmt ( & self , fmt : & mut fmt ::Formatter < '_ > ) -> fmt ::Result {
2021-08-08 08:04:33 +00:00
match self . repr . data ( ) {
ErrorData ::Os ( code ) = > {
2015-02-01 04:24:36 +00:00
let detail = sys ::os ::error_string ( code ) ;
write! ( fmt , " {} (os error {}) " , detail , code )
}
2021-08-08 08:04:33 +00:00
ErrorData ::Custom ( ref c ) = > c . error . fmt ( fmt ) ,
ErrorData ::Simple ( kind ) = > write! ( fmt , " {} " , kind . as_str ( ) ) ,
ErrorData ::SimpleMessage ( msg ) = > msg . message . fmt ( fmt ) ,
2015-02-01 04:24:36 +00:00
}
}
}
std: Stabilize the `io` module
The new `std::io` module has had some time to bake now, and this commit
stabilizes its functionality. There are still portions of the module which
remain unstable, and below contains a summart of the actions taken.
This commit also deprecates the entire contents of the `old_io` module in a
blanket fashion. All APIs should now have a reasonable replacement in the
new I/O modules.
Stable APIs:
* `std::io` (the name)
* `std::io::prelude` (the name)
* `Read`
* `Read::read`
* `Read::{read_to_end, read_to_string}` after being modified to return a `usize`
for the number of bytes read.
* `Write`
* `Write::write`
* `Write::{write_all, write_fmt}`
* `BufRead`
* `BufRead::{fill_buf, consume}`
* `BufRead::{read_line, read_until}` after being modified to return a `usize`
for the number of bytes read.
* `BufReader`
* `BufReader::{new, with_capacity}`
* `BufReader::{get_ref, get_mut, into_inner}`
* `{Read,BufRead} for BufReader`
* `BufWriter`
* `BufWriter::{new, with_capacity}`
* `BufWriter::{get_ref, get_mut, into_inner}`
* `Write for BufWriter`
* `IntoInnerError`
* `IntoInnerError::{error, into_inner}`
* `{Error,Display} for IntoInnerError`
* `LineWriter`
* `LineWriter::{new, with_capacity}` - `with_capacity` was added
* `LineWriter::{get_ref, get_mut, into_inner}` - `get_mut` was added)
* `Write for LineWriter`
* `BufStream`
* `BufStream::{new, with_capacities}`
* `BufStream::{get_ref, get_mut, into_inner}`
* `{BufRead,Read,Write} for BufStream`
* `stdin`
* `Stdin`
* `Stdin::lock`
* `Stdin::read_line` - added method
* `StdinLock`
* `Read for Stdin`
* `{Read,BufRead} for StdinLock`
* `stdout`
* `Stdout`
* `Stdout::lock`
* `StdoutLock`
* `Write for Stdout`
* `Write for StdoutLock`
* `stderr`
* `Stderr`
* `Stderr::lock`
* `StderrLock`
* `Write for Stderr`
* `Write for StderrLock`
* `io::Result`
* `io::Error`
* `io::Error::last_os_error`
* `{Display, Error} for Error`
Unstable APIs:
(reasons can be found in the commit itself)
* `Write::flush`
* `Seek`
* `ErrorKind`
* `Error::new`
* `Error::from_os_error`
* `Error::kind`
Deprecated APIs
* `Error::description` - available via the `Error` trait
* `Error::detail` - available via the `Display` implementation
* `thread::Builder::{stdout, stderr}`
Changes in functionality:
* `old_io::stdio::set_stderr` is now a noop as the infrastructure for printing
backtraces has migrated to `std::io`.
* The `ReadExt`, `WriteExt`, and `BufReadExt` extension traits were all removed
by folding functionality into the corresponding trait.
[breaking-change]
2015-03-11 21:16:46 +00:00
#[ stable(feature = " rust1 " , since = " 1.0.0 " ) ]
impl error ::Error for Error {
2019-12-01 04:01:48 +00:00
#[ allow(deprecated, deprecated_in_future) ]
2015-02-01 04:24:36 +00:00
fn description ( & self ) -> & str {
2021-08-08 08:04:33 +00:00
match self . repr . data ( ) {
ErrorData ::Os ( .. ) | ErrorData ::Simple ( .. ) = > self . kind ( ) . as_str ( ) ,
ErrorData ::SimpleMessage ( msg ) = > msg . message ,
2021-08-08 12:13:35 +00:00
ErrorData ::Custom ( c ) = > c . error . description ( ) ,
2015-02-01 04:24:36 +00:00
}
}
2015-05-27 03:39:14 +00:00
2018-12-05 14:42:56 +00:00
#[ allow(deprecated) ]
2018-07-10 18:35:36 +00:00
fn cause ( & self ) -> Option < & dyn error ::Error > {
2021-08-08 08:04:33 +00:00
match self . repr . data ( ) {
ErrorData ::Os ( .. ) = > None ,
ErrorData ::Simple ( .. ) = > None ,
ErrorData ::SimpleMessage ( .. ) = > None ,
2021-08-08 12:13:35 +00:00
ErrorData ::Custom ( c ) = > c . error . cause ( ) ,
2015-05-27 03:39:14 +00:00
}
}
2019-03-06 03:33:22 +00:00
fn source ( & self ) -> Option < & ( dyn error ::Error + 'static ) > {
2021-08-08 08:04:33 +00:00
match self . repr . data ( ) {
ErrorData ::Os ( .. ) = > None ,
ErrorData ::Simple ( .. ) = > None ,
ErrorData ::SimpleMessage ( .. ) = > None ,
2021-08-08 12:13:35 +00:00
ErrorData ::Custom ( c ) = > c . error . source ( ) ,
2019-03-06 03:33:22 +00:00
}
}
2015-02-01 04:24:36 +00:00
}
2015-04-06 23:30:18 +00:00
fn _assert_error_is_sync_send ( ) {
2019-11-27 18:29:00 +00:00
fn _is_sync_send < T : Sync + Send > ( ) { }
2015-04-06 23:30:18 +00:00
_is_sync_send ::< Error > ( ) ;
}