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!("lines!");

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

    let source = input.source.value();
    let source_len = source.lines().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.lines().skip(start).take(end).for_each(|s| {
            result.push_str(s);
            result.push('\n');
        });
    }

    if result.ends_with('\n') {
        result.pop();
    }

    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/lines/*.pass.rs");
        t.compile_fail("tests/lines/*.fail.rs");
    }
}