maybe-valid 0.1.0

Traits and outcome enums for structural validation/refinement conversions
Documentation
use ::core::str::Utf8Error;

use ::alloc::ffi::CString;
use ::alloc::string::String;
use ::alloc::vec::Vec;

use crate::{CStrInvalidReason, IntoValidated, MaybeValidOwned, Validated};

impl Validated for String {
    type InvalidReason = Utf8Error;
}

impl IntoValidated<String> for Vec<u8> {
    fn into_validated(self) -> MaybeValidOwned<String, Self> {
        match String::from_utf8(self) {
            Ok(v) => MaybeValidOwned::Valid(v),
            Err(e) => {
                let err = e.utf8_error();
                MaybeValidOwned::Invalid(e.into_bytes(), err)
            }
        }
    }
}

impl Validated for CString {
    type InvalidReason = CStrInvalidReason;
}

impl IntoValidated<CString> for Vec<u8> {
    fn into_validated(self) -> MaybeValidOwned<CString, Self> {
        match CString::from_vec_with_nul(self) {
            Ok(v) => MaybeValidOwned::Valid(v),
            Err(e) => MaybeValidOwned::Invalid(e.into_bytes(), CStrInvalidReason::Unspecified),
        }
    }
}