use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, LitByteStr, LitStr};
#[proc_macro]
pub fn cstr(input: TokenStream) -> TokenStream {
let input_clone = input.clone();
let input_str = parse_macro_input!(input as LitStr);
let mut input_bytes = input_str.value().into_bytes();
if let Some(null_idx) = input_bytes.iter().position(|n| *n == 0) {
panic!(
"{} contains a null byte at position {}",
input_clone, null_idx
);
}
input_bytes.push(0);
let output_bytes = LitByteStr::new(&input_bytes, input_str.span());
quote! { unsafe { std::ffi::CStr::from_bytes_with_nul_unchecked(#output_bytes) } }.into()
}