tstr_proc_macros 0.2.2

Implementation detail of tstr.
Documentation
use crate::{
    used_proc_macro::{Span, TokenStream},
    utils::{char_token, colon2_token, ident_token, punct_token},
    TStr,
};

pub(crate) fn output_tstr_param(crate_path: &TokenStream, tstr: &TStr, out: &mut TokenStream) {
    let string = tstr.string.chars().collect::<Vec<char>>();
    let span = tstr.span;

    out.extend(crate::nested_tuple_compute::compute(
        &string,
        span,
        &mut |string, ts| {
            write_chars(ts, string, crate_path, span);
        },
    ));
}

fn write_chars(ts: &mut TokenStream, string: &[char], crate_path: &TokenStream, span: Span) {
    const TY: &[&str; 9] = &["", "__a", "__b", "__c", "__d", "__e", "__f", "__g", "__"];

    ts.extend(crate_path.clone());
    ts.extend(colon2_token(span));
    ts.extend(ident_token(TY[string.len()], span));
    ts.extend(punct_token('<', span));
    for &c in string {
        ts.extend(char_token(c, span));
        ts.extend(punct_token(',', span));
    }
    ts.extend(punct_token('>', span));
}