| //! Platform dependent types. | |
| cfg_if::cfg_if! { | |
| if #[cfg(feature = "std")] { | |
| use std::borrow::Cow; | |
| use std::fmt; | |
| use std::path::PathBuf; | |
| use std::prelude::v1::*; | |
| use std::str; | |
| } | |
| } | |
| /// A platform independent representation of a string. When working with `std` | |
| /// enabled it is recommended to the convenience methods for providing | |
| /// conversions to `std` types. | |
| #[derive(Debug)] | |
| pub enum BytesOrWideString<'a> { | |
| /// A slice, typically provided on Unix platforms. | |
| Bytes(&'a [u8]), | |
| /// Wide strings typically from Windows. | |
| Wide(&'a [u16]), | |
| } | |
| #[cfg(feature = "std")] | |
| impl<'a> BytesOrWideString<'a> { | |
| /// Lossy converts to a `Cow<str>`, will allocate if `Bytes` is not valid | |
| /// UTF-8 or if `BytesOrWideString` is `Wide`. | |
| /// | |
| /// # Required features | |
| /// | |
| /// This function requires the `std` feature of the `backtrace` crate to be | |
| /// enabled, and the `std` feature is enabled by default. | |
| pub fn to_str_lossy(&self) -> Cow<'a, str> { | |
| use self::BytesOrWideString::*; | |
| match *self { | |
| Bytes(slice) => String::from_utf8_lossy(slice), | |
| Wide(wide) => Cow::Owned(String::from_utf16_lossy(wide)), | |
| } | |
| } | |
| /// Provides a `Path` representation of `BytesOrWideString`. | |
| /// | |
| /// # Required features | |
| /// | |
| /// This function requires the `std` feature of the `backtrace` crate to be | |
| /// enabled, and the `std` feature is enabled by default. | |
| pub fn into_path_buf(self) -> PathBuf { | |
| #[cfg(unix)] | |
| { | |
| use std::ffi::OsStr; | |
| use std::os::unix::ffi::OsStrExt; | |
| if let BytesOrWideString::Bytes(slice) = self { | |
| return PathBuf::from(OsStr::from_bytes(slice)); | |
| } | |
| } | |
| #[cfg(windows)] | |
| { | |
| use std::ffi::OsString; | |
| use std::os::windows::ffi::OsStringExt; | |
| if let BytesOrWideString::Wide(slice) = self { | |
| return PathBuf::from(OsString::from_wide(slice)); | |
| } | |
| } | |
| if let BytesOrWideString::Bytes(b) = self { | |
| if let Ok(s) = str::from_utf8(b) { | |
| return PathBuf::from(s); | |
| } | |
| } | |
| unreachable!() | |
| } | |
| } | |
| #[cfg(feature = "std")] | |
| impl<'a> fmt::Display for BytesOrWideString<'a> { | |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| self.to_str_lossy().fmt(f) | |
| } | |
| } |