pub use alloc_crate::ffi::CString;
use alloc_crate::vec::Vec;
use crate::alloc_crate;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TryNewError {
NulError(usize, Vec<u8>),
AllocError,
}
pub struct FallibleCString(CString);
impl FallibleCString {
pub unsafe fn from_vec_unchecked(v: Vec<u8>) -> Result<Self, TryNewError> {
let cs = unsafe { CString::from_vec_unchecked(v) };
Ok(FallibleCString(cs))
}
pub fn new(v: Vec<u8>) -> Result<Self, TryNewError> {
match CString::new(v) {
Ok(cs) => Ok(FallibleCString(cs)),
Err(e) => Err(TryNewError::NulError(e.nul_position(), e.into_vec())),
}
}
}
impl core::ops::Deref for FallibleCString {
type Target = CString;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl From<crate::alloc::AllocError> for TryNewError {
fn from(_err: crate::alloc::AllocError) -> Self {
TryNewError::AllocError
}
}