1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use syn::{parse, LitStr};
5
6#[proc_macro]
7pub fn w(input: TokenStream) -> TokenStream {
8 let string_literal: LitStr = match parse(input) {
9 Ok(literal) => literal,
10 Err(_) => panic!("Something other than a string literal was provided.")
11 };
12 let string = string_literal.value();
13 let mut output = String::from("&[");
14 for (i, code_unit) in string.encode_utf16().enumerate() {
15 if code_unit == 0 {
16 panic!("A null-terminated wide string cannot contain a null character.")
17 }
18 output.push_str(&format!("0x{:X}", code_unit));
19 if i == 0 {
20 output.push_str("u16");
21 }
22 output.push(',');
23 }
24 output.push_str("0x0][0] as &'static u16");
25 output.parse().unwrap()
26}
27