From 1eefda65b2488528e465f5031cb0a22369d83719 Mon Sep 17 00:00:00 2001 From: Nikolai Vazquez Date: Thu, 23 Nov 2017 11:53:37 -0500 Subject: [PATCH] Add TryFrom impls for CString and CStr Conversions: - Vec to CString - CString to String - &[u8] to &CStr --- src/libstd/ffi/c_str.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/libstd/ffi/c_str.rs b/src/libstd/ffi/c_str.rs index 1aa47f066b69f..6062671bffebe 100644 --- a/src/libstd/ffi/c_str.rs +++ b/src/libstd/ffi/c_str.rs @@ -11,6 +11,7 @@ use ascii; use borrow::{Cow, Borrow}; use cmp::Ordering; +use convert::TryFrom; use error::Error; use fmt::{self, Write}; use io; @@ -646,6 +647,24 @@ impl From for Vec { } } +#[unstable(feature = "try_from", issue = "33417")] +impl TryFrom> for CString { + type Error = NulError; + + fn try_from(bytes: Vec) -> Result { + CString::_new(bytes) + } +} + +#[unstable(feature = "try_from", issue = "33417")] +impl TryFrom for String { + type Error = IntoStringError; + + fn try_from(c_str: CString) -> Result { + c_str.into_string() + } +} + #[stable(feature = "cstr_debug", since = "1.3.0")] impl fmt::Debug for CStr { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { @@ -657,6 +676,15 @@ impl fmt::Debug for CStr { } } +#[unstable(feature = "try_from", issue = "33417")] +impl<'a> TryFrom<&'a [u8]> for &'a CStr { + type Error = FromBytesWithNulError; + + fn try_from(bytes: &[u8]) -> Result<&CStr, FromBytesWithNulError> { + CStr::from_bytes_with_nul(bytes) + } +} + #[stable(feature = "cstr_default", since = "1.10.0")] impl<'a> Default for &'a CStr { fn default() -> &'a CStr {