null-terminated-str 0.1.4

FFI-friendly utf-8 string, enabling const null-terminated str and caching of the non-terminated string to avoid frequent allocation.
Documentation
use std::borrow::Cow;

use super::{const_null_terminated_str, NullTerminatedStr, NullTerminatedString};

pub trait IntoNullTerminatedString<'a> {
    fn into_null_terminated_string(self) -> Cow<'a, NullTerminatedStr>;
}

impl<'a> IntoNullTerminatedString<'a> for &'a str {
    fn into_null_terminated_string(self) -> Cow<'a, NullTerminatedStr> {
        if self.is_empty() {
            Cow::Borrowed(const_null_terminated_str!(""))
        } else {
            NullTerminatedStr::try_from_str(self)
                .map(Cow::Borrowed)
                .unwrap_or_else(|| Cow::Owned(NullTerminatedString::from(self)))
        }
    }
}

impl IntoNullTerminatedString<'static> for String {
    fn into_null_terminated_string(self) -> Cow<'static, NullTerminatedStr> {
        Cow::Owned(NullTerminatedString::from(self))
    }
}

impl<'a> IntoNullTerminatedString<'a> for &'a NullTerminatedStr {
    fn into_null_terminated_string(self) -> Cow<'a, NullTerminatedStr> {
        Cow::Borrowed(self)
    }
}

impl<'a> IntoNullTerminatedString<'a> for NullTerminatedString {
    fn into_null_terminated_string(self) -> Cow<'a, NullTerminatedStr> {
        Cow::Owned(self)
    }
}