pub(crate) fn toml_string(s: &str) -> String {
toml::Value::String(s.to_owned()).to_string()
}
pub(crate) fn toml_array_inner(xs: &[String]) -> String {
xs.iter()
.map(|s| toml_string(s))
.collect::<Vec<_>>()
.join(", ")
}
#[cfg(test)]
pub(crate) const HOSTILE_TITLE: &str = "a\"b\\c\nd";
#[cfg(test)]
pub(crate) const HOSTILE_SLUG: &str = "p\"q";
#[cfg(test)]
mod tests {
use super::*;
fn round_trip_string(literal: &str) -> String {
let doc = format!("v = {literal}");
let parsed: toml::Value = toml::from_str(&doc).unwrap();
parsed["v"].as_str().unwrap().to_owned()
}
fn round_trip_array(inner: &str) -> Vec<String> {
let doc = format!("v = [{inner}]");
let parsed: toml::Value = toml::from_str(&doc).unwrap();
parsed["v"]
.as_array()
.unwrap()
.iter()
.map(|e| e.as_str().unwrap().to_owned())
.collect()
}
#[test]
fn toml_string_is_identity_on_safe_input() {
assert_eq!(toml_string("Fast boot"), "\"Fast boot\"");
}
#[test]
fn toml_string_escapes_quote_backslash_newline() {
for hostile in ["a\"b", "a\\b", "a\nb", "a\"\\\nb", "ends-with-quote\""] {
let literal = toml_string(hostile);
assert_eq!(
round_trip_string(&literal),
hostile,
"literal was {literal}"
);
}
}
#[test]
fn toml_array_inner_escapes_string_and_array_breakers() {
let xs = vec![
"plain".to_owned(),
"has]bracket".to_owned(),
"has,comma".to_owned(),
"has\"quote".to_owned(),
"has\nnewline".to_owned(),
];
assert_eq!(round_trip_array(&toml_array_inner(&xs)), xs);
}
#[test]
fn toml_array_inner_empty_is_empty() {
assert_eq!(toml_array_inner(&[]), "");
assert_eq!(
round_trip_array(&toml_array_inner(&[])),
Vec::<String>::new()
);
}
}