fmt2 0.3.4

traits, structs and macros for formatting
Documentation
#[inline]
#[must_use]
pub fn has_newlines(s: &str) -> bool {
    let v = s.contains('\n');
    #[cfg(debug_assertions)]
    {
        let v2 = s.chars().any(|c| c == '\n');
        debug_assert_eq!(v, v2);
        let count = count_newlines(s);
        debug_assert_eq!(v, count != 0);
    }
    v
}

#[inline]
#[must_use]
pub fn count_newlines(s: &str) -> usize {
    s.chars().filter(|&c| c == '\n').count()
}

#[inline]
#[must_use]
pub fn first_line(s: &str) -> &str {
    let s = first_line_no_debug_assertion(s);
    #[cfg(debug_assertions)]
    {
        debug_assert!(!has_newlines(s));
        debug_assert_eq!(count_newlines(s), 0);
    }
    s
}

#[inline]
#[must_use]
pub fn first_line_no_debug_assertion(s: &str) -> &str {
    match s.find('\n') {
        Some(i) => unsafe { s.get_unchecked(..i) },
        None => s,
    }
}

#[allow(unused)]
#[cfg(test)]
mod tests {

    use super::*;

    #[test]
    fn test_first_line() {
        assert_eq!(first_line_no_debug_assertion("123"), "123");
        assert_eq!(first_line_no_debug_assertion("123\nabc"), "123");
        assert_eq!(first_line_no_debug_assertion("123\n"), "123");
        assert_eq!(first_line_no_debug_assertion("123\nabc\n456"), "123");
        assert_eq!(first_line_no_debug_assertion("123\nabc\n"), "123");
        assert_eq!(first_line_no_debug_assertion("\nabc"), "");
        assert_eq!(first_line_no_debug_assertion("\n"), "");
        assert_eq!(first_line_no_debug_assertion(""), "");
    }
}