line-span 0.1.1

Find line ranges and jump between next and previous lines
Documentation

line-span

Build Status Latest Version Docs License

This crate features utilities for finding the start, end, and range of lines from a byte index. Further also being able to find the next and previous line, from an arbitrary byte index.

Usage

Add this to your Cargo.toml:

[dependencies]
line-span = "0.1"

Releases

Release notes are available in the repo at CHANGELOG.md.


Current Line:

Next Line:

Previous Line:

Utilities:

LineSpan and LineSpanIter

The crate includes the LineSpanIter iterator. It is functionally equivalent to str::lines, with the addition that it includes the ability to get the start and end byte indices of each line.

An LineSpanIter can be created by calling line_spans, implemented in the LineSpans trait. The crate implements the LineSpans trait for str and String.

Note, LineSpan implements Deref to &str, so in general, swapping lines to line_spans would not cause many issues.

use line_span::LineSpans;

let text = "foo\nbar\r\nbaz";

for span in text.line_spans() {
    println!("{:>2?}: {:?}", span.range(), span.as_str());
}

This will output the following:

 0.. 3: "foo"
 4.. 7: "bar"
 9..12: "baz"

Current Line, Previous Line, and Next Line

use line_span::{find_line_range, find_next_line_range, find_prev_line_range};

let text = "foo\nbar\r\nbaz";
//                ^
let i = 5; // 'a' in "bar"

let curr_range = find_line_range(text, i);
let next_range = find_next_line_range(text, i).unwrap();
let prev_range = find_prev_line_range(text, i).unwrap();

assert_eq!(curr_range, 4..7);
assert_eq!(&text[curr_range], "bar");

assert_eq!(prev_range, 0..3);
assert_eq!(&text[prev_range], "foo");

assert_eq!(next_range, 9..12);
assert_eq!(&text[next_range], "baz");