wide_literals/
lib.rs

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