lit-mod 0.2.0

lit-mod is a collection of procedural macros for working with string literals.
Documentation
use crate::util::{end_to_usize, slice_like, start_to_usize};
use proc_macro::TokenStream;
use syn::__private::ToTokens;
use syn::parse_macro_input;

slice_like!("slice!");

pub fn slice(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as Slice);

    let source = input.source.value();
    let source_len = source.chars().count();
    let mut result = String::new();

    for range in input.ranges {
        let start = start_to_usize(source_len, range.0);
        let end = end_to_usize(source_len, range.1) - start;

        source
            .chars()
            .skip(start)
            .take(end)
            .for_each(|c| result.push(c));
    }

    LitStr::new(&result, input.source.span())
        .into_token_stream()
        .into()
}

#[cfg(test)]
mod test {
    use trybuild::TestCases;

    #[test]
    fn test_build() {
        let t = TestCases::new();
        t.pass("tests/slice/*.pass.rs");
        t.compile_fail("tests/slice/*.fail.rs");
    }
}