1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use syn::{parse, LitStr};
5use encoding_rs::SHIFT_JIS;
6
7#[proc_macro]
8pub fn sjis(input: TokenStream) -> TokenStream {
9 let string_literal: LitStr = match parse(input) {
10 Ok(literal) => literal,
11 Err(_) => panic!("Something other than a string literal was provided.")
12 };
13 let string = string_literal.value();
14 let (bytes, _, error) = SHIFT_JIS.encode(&string);
15 if error {
16 panic!("The string literal contains a character that is not representable.");
17 }
18 let mut output = String::from("[");
19 for (i, &byte) in bytes.iter().enumerate() {
20 output.push_str(&format!("0x{:X}", byte));
21 if i == 0 {
22 output.push_str("u8");
23 }
24 output.push(',');
25 }
26 output.push(']');
27 output.parse().unwrap()
28}