1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
extern crate proc_macro;

use proc_macro::TokenStream;

fn get_value_from_token_stream(input: TokenStream) -> String {
    let val = format!("{}", input);
    if !val.starts_with('"') || !val.ends_with('"') {
        panic!("Argument must be a string literal.");
    }
    let len = val.len();
    (&val[1..len - 1]).to_string()
}

#[proc_macro]
pub fn tinystr4(input: TokenStream) -> TokenStream {
    let val = get_value_from_token_stream(input);
    let bytes: u32 = tinystr::TinyStr4::from_bytes(val.as_bytes())
        .expect("Failed to construct TinyStr from input")
        .into();

    let formula = format!("unsafe {{ tinystr::TinyStr4::new_unchecked({}) }}", bytes);
    formula.parse().unwrap()
}

#[proc_macro]
pub fn tinystr8(input: TokenStream) -> TokenStream {
    let val = get_value_from_token_stream(input);
    let bytes: u64 = tinystr::TinyStr8::from_bytes(val.as_bytes())
        .expect("Failed to construct TinyStr from input")
        .into();
    let formula = format!("unsafe {{ tinystr::TinyStr8::new_unchecked({}) }}", bytes);
    formula.parse().unwrap()
}

#[proc_macro]
pub fn tinystr16(input: TokenStream) -> TokenStream {
    let val = get_value_from_token_stream(input);
    let bytes: u128 = tinystr::TinyStr16::from_bytes(val.as_bytes())
        .expect("Failed to construct TinyStr from input")
        .into();
    let formula = format!("unsafe {{ tinystr::TinyStr16::new_unchecked({}) }}", bytes);
    formula.parse().unwrap()
}