Skip to main content

sjis_literals/
lib.rs

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}