use crate::ffi::{OsStr, OsString}; use crate::mem; use crate::sealed::Sealed; use crate::sys::os_str::Buf; use crate::sys_common::{AsInner, FromInner, IntoInner}; // Note: this file is currently reused in other `std::os::{platform}::ffi` modules to reduce duplication. // Keep this in mind when applying changes to this file that only apply to `unix`. /// Platform-specific extensions to [`OsString`]. /// /// This trait is sealed: it cannot be implemented outside the standard library. /// This is so that future additional methods are not breaking changes. #[stable(feature = "rust1", since = "1.0.0")] pub trait OsStringExt: Sealed { /// Creates an [`OsString`] from a byte vector. /// /// See the module documentation for an example. #[stable(feature = "rust1", since = "1.0.0")] fn from_vec(vec: Vec) -> Self; /// Yields the underlying byte vector of this [`OsString`]. /// /// See the module documentation for an example. #[stable(feature = "rust1", since = "1.0.0")] fn into_vec(self) -> Vec; } #[stable(feature = "rust1", since = "1.0.0")] impl OsStringExt for OsString { #[inline] fn from_vec(vec: Vec) -> OsString { FromInner::from_inner(Buf { inner: vec }) } #[inline] fn into_vec(self) -> Vec { self.into_inner().inner } } /// Platform-specific extensions to [`OsStr`]. /// /// This trait is sealed: it cannot be implemented outside the standard library. /// This is so that future additional methods are not breaking changes. #[stable(feature = "rust1", since = "1.0.0")] pub trait OsStrExt: Sealed { #[stable(feature = "rust1", since = "1.0.0")] /// Creates an [`OsStr`] from a byte slice. /// /// See the module documentation for an example. fn from_bytes(slice: &[u8]) -> &Self; /// Gets the underlying byte view of the [`OsStr`] slice. /// /// See the module documentation for an example. #[stable(feature = "rust1", since = "1.0.0")] fn as_bytes(&self) -> &[u8]; } #[stable(feature = "rust1", since = "1.0.0")] impl OsStrExt for OsStr { #[inline] fn from_bytes(slice: &[u8]) -> &OsStr { unsafe { mem::transmute(slice) } } #[inline] fn as_bytes(&self) -> &[u8] { &self.as_inner().inner } }