#![no_std]
#![forbid(unsafe_code)]
#![doc(html_root_url = "https://docs.rs/redent/0.1.0")]
extern crate alloc;
use alloc::string::String;
use indent_string::indent_string_with;
use strip_indent::strip_indent;
#[cfg(doctest)]
#[doc = include_str!("../README.md")]
struct ReadmeDoctests;
#[must_use]
pub fn redent(string: &str) -> String {
redent_with(string, 0, " ", false)
}
#[must_use]
pub fn redent_with(string: &str, count: usize, indent: &str, include_empty_lines: bool) -> String {
let stripped = strip_indent(string);
indent_string_with(&stripped, count, indent, include_empty_lines)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn strip_only() {
assert_eq!(redent(" foo\n bar"), "foo\n bar");
assert_eq!(redent(" x"), "x");
assert_eq!(redent(""), "");
assert_eq!(redent("already\nflush"), "already\nflush");
}
#[test]
fn strip_then_indent() {
assert_eq!(
redent_with(" foo\n bar", 2, " ", false),
" foo\n bar"
);
assert_eq!(
redent_with(" foo\n bar", 1, "\t", false),
"\tfoo\n\t bar"
);
assert_eq!(
redent_with("already\nflush", 2, " ", false),
" already\n flush"
);
}
#[test]
fn round_trip_and_empty_lines() {
assert_eq!(
redent_with("\n unicorn\n rainbow\n", 2, " ", false),
"\n unicorn\n rainbow\n"
);
assert_eq!(redent_with(" a\n\n b", 2, " ", true), " a\n \n b");
assert_eq!(redent_with("anything", 0, " ", false), "anything");
}
}