pub(crate) fn escape_data(s: &str) -> String {
s.replace('%', "%25")
.replace('\r', "%0D")
.replace('\n', "%0A")
}
pub(crate) fn escape_property(s: &str) -> String {
s.replace('%', "%25")
.replace('\r', "%0D")
.replace('\n', "%0A")
.replace(':', "%3A")
.replace(',', "%2C")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn data_encodes_percent_first() {
assert_eq!(escape_data("%\n"), "%25%0A");
assert_eq!(escape_data("a%b"), "a%25b");
assert_eq!(escape_data("l1\r\nl2"), "l1%0D%0Al2");
}
#[test]
fn data_leaves_colon_and_comma() {
assert_eq!(escape_data("a:b,c"), "a:b,c");
}
#[test]
fn property_encodes_colon_and_comma_too() {
assert_eq!(escape_property("a:b,c"), "a%3Ab%2Cc");
assert_eq!(escape_property("%\r\n:,"), "%25%0D%0A%3A%2C");
}
#[test]
fn empty_is_empty() {
assert_eq!(escape_data(""), "");
assert_eq!(escape_property(""), "");
}
}