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:

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. 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.

```rust use line_span::LineSpans;

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

for span in text.linespans() { println!( "{:>2?}: {:?} {:?}", span.range(), span.asstr(), span.asstrwith_ending(), ); } ```

This will output the following:

text 0.. 3: "foo" "foo\n" 4.. 7: "bar" "bar\r\n" 9..12: "baz" "baz"

Current Line, Previous Line, and Next Line

```rust use linespan::{findlinerange, findnextlinerange, findprevline_range};

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

let currrange = findlinerange(text, i); let nextrange = findnextlinerange(text, i).unwrap(); let prevrange = findprevline_range(text, i).unwrap();

asserteq!(currrange, 4..7); asserteq!(&text[currrange], "bar");

asserteq!(prevrange, 0..3); asserteq!(&text[prevrange], "foo");

asserteq!(nextrange, 9..12); asserteq!(&text[nextrange], "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.

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

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

// Returns Some as substring is a part of string1 asserteq!(strto_range(string1, substring), Some(4..7));

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