#![no_std]
#![forbid(unsafe_code)]
#![doc(html_root_url = "https://docs.rs/trim-newlines/0.1.0")]
#[cfg(doctest)]
#[doc = include_str!("../README.md")]
struct ReadmeDoctests;
fn is_newline(c: char) -> bool {
c == '\r' || c == '\n'
}
#[must_use]
pub fn trim_newlines(string: &str) -> &str {
string.trim_matches(is_newline)
}
#[must_use]
pub fn trim_newlines_start(string: &str) -> &str {
string.trim_start_matches(is_newline)
}
#[must_use]
pub fn trim_newlines_end(string: &str) -> &str {
string.trim_end_matches(is_newline)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn both_ends() {
assert_eq!(trim_newlines("\n\nfoo\n\n"), "foo");
assert_eq!(trim_newlines("\r\n\r\nbar\r\n"), "bar");
assert_eq!(trim_newlines("\r\rmid\r\r"), "mid");
assert_eq!(trim_newlines("no"), "no");
assert_eq!(trim_newlines(""), "");
}
#[test]
fn start_only() {
assert_eq!(trim_newlines_start("\n\nfoo\n\n"), "foo\n\n");
assert_eq!(trim_newlines_start("\r\n\r\nbar\r\n"), "bar\r\n");
assert_eq!(trim_newlines_start("no"), "no");
}
#[test]
fn end_only() {
assert_eq!(trim_newlines_end("\n\nfoo\n\n"), "\n\nfoo");
assert_eq!(trim_newlines_end("\r\n\r\nbar\r\n"), "\r\n\r\nbar");
assert_eq!(trim_newlines_end("no"), "no");
}
#[test]
fn only_trims_newlines_not_other_whitespace() {
assert_eq!(trim_newlines(" spaced "), " spaced ");
assert_eq!(trim_newlines("\tfoo\t"), "\tfoo\t");
assert_eq!(trim_newlines("\n \nx\n \n"), " \nx\n ");
assert_eq!(trim_newlines_start("\n \nx\n \n"), " \nx\n \n");
assert_eq!(trim_newlines_end("\n \nx\n \n"), "\n \nx\n ");
}
#[test]
fn all_newlines() {
assert_eq!(trim_newlines("\n\r\n\r"), "");
assert_eq!(trim_newlines_start("\n\r\n\r"), "");
assert_eq!(trim_newlines_end("\n\r\n\r"), "");
}
}