[][src]Crate line_span

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.

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. Additionally, it also includes the ability to get the end including and excluding the line ending (\n or \r\n).

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(),
        span.as_str_with_ending(),
    );
}

This will output the following:

0.. 3: "foo" "foo\n"
4.. 7: "bar" "bar\r\n"
9..12: "baz" "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");

Range of Substring in String

Use str_to_range (or str_to_range_unchecked) to get the range of a substring in a string.

let string1 = "Foo Bar Baz";
let string2 = "Hello World";

let substring = &string1[4..7]; // "Bar"

// Returns `Some` as `substring` is a part of `string1`
assert_eq!(str_to_range(string1, substring), Some(4..7));

// Returns `None` as `substring` is not a part of `string2`
assert_eq!(str_to_range(string2, substring), None);

Structs

LineSpan

LineSpan represents a single line. It is possible to get a &str of the line both including and excluding \n and \r\n.

LineSpanIter

An iterator over LineSpans.

Traits

LineSpans

Trait which implements line_spans to get a LineSpanIter.

Functions

find_line_end

Find the end (byte index) of the line, which index is within.

find_line_range

Find the start and end (byte index) of the line, which index is within.

find_line_start

Find the start (byte index) of the line, which index is within.

find_next_line_end

Find the end (byte index) of the next line, the line after the one which index is within.

find_next_line_range

Find the start and end (byte index) of the next line, the line after the one which index is within.

find_next_line_start

Find the start (byte index) of the next line, the line after the one which index is within.

find_prev_line_end

Find the end (byte index) of the previous line, the line before the one which index is within.

find_prev_line_range

Find the start and end (byte index) of the previous line, the line before the one which index is within.

find_prev_line_start

Find the start (byte index) of the previous line, the line before the one which index is within.

str_to_range

Get the start and end (byte index) range (Range<usize>), where substring is located in string. The returned range is relative to string.

str_to_range_unchecked

Get the start and end (byte index) range (Range<usize>), where substring is located in string. The returned range is relative to string.