Documentation
use proc_macro::{TokenStream};
use quote::{quote};
use syn::{parse_macro_input, LitStr, Error};

pub fn transform(input: TokenStream, internal: bool) -> TokenStream {
    let input: LitStr = parse_macro_input!(input as LitStr);
    let mut val = input.value();
    if val.contains("\0") {
        return TokenStream::from(
            Error::new(input.span(), "Literal contains a 0 byte").to_compile_error()
        );
    }
    val.push('\0');
    let crat = if internal { quote!(crate) } else { quote!(linux) };
    let tokens = quote! {
        unsafe {
            static S: &str = #val;
            #crat::util::kstr::KStr::new(S.as_ptr() as *const _)
        }
    };
    TokenStream::from(tokens)
}