detect-newline
Detect and normalize line endings — \n (LF), \r\n (CRLF), and \r (CR).
Zero dependencies and no_std. A Rust take on Node's
detect-newline, plus the
conversion and line-splitting you usually reach for next.
use ;
assert_eq!; // first ending found
assert_eq!; // most common
assert_eq!; // normalize
assert_eq!; // CR-aware
Why detect-newline?
The Rust standard library's str::lines splits on \n/\r\n but not a lone \r,
and there's no built-in way to detect a string's line-ending style or normalize a
mixed string to one. This crate is the small, focused piece — pick a window of text
apart by line ending, decide which one a file uses, and convert between them.
[]
= "0.1"
API
| Item | Purpose |
|---|---|
detect(text) |
The first line ending, or None |
dominant(text) |
The most frequent line ending (ties → first occurrence) |
count(text) |
Counts { lf, crlf, cr } of each style |
normalize(text, to) / to_lf / to_crlf / to_cr |
Convert every ending to one style |
lines(text) |
Iterate lines, splitting on \n, \r\n, and lone \r |
has_trailing_newline(text) / strip_trailing_newline(text) |
Trailing-ending helpers |
Newline |
Lf (default), CrLf, Cr |
Behavior
\r\nis always one line ending, never a\rfollowed by a\n— in detection, counting, normalization, and splitting alike.detectreturns the first ending found;dominantreturns the most frequent, breaking ties toward whichever style occurs first.normalizeoperates on character boundaries (safe for any UTF-8) and is idempotent.linesmirrorsstr::linesbut also splits a lone\r; a single trailing line ending does not yield a final empty line.
no_std
#![no_std] (needs only alloc for String) with zero dependencies.
Contributors ✨
This project follows the all-contributors specification. Contributions of any kind are welcome — code, docs, bug reports, ideas, reviews! See the emoji key for how each contribution is recognized, and open a PR or issue to get involved.
Thanks goes to these wonderful people:
License
Licensed under either of Apache-2.0 or MIT at your option.