From: Ian Jackson Date: Sat, 14 May 2022 01:05:09 +0000 (+0100) Subject: Provide TomlQuote instead X-Git-Tag: otter-1.1.0~201 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=b13be3b7ead75655686a915478f34b288e026cd5;p=otter.git Provide TomlQuote instead This is slightly better in terms of consing. Signed-off-by: Ian Jackson --- diff --git a/src/utils.rs b/src/utils.rs index d2b640bb..14f2986d 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -334,27 +334,31 @@ impl Result> //========== toml ==================== +#[derive(Debug,Copy,Clone,Eq,PartialEq,Ord,PartialOrd)] +struct TomlQuote<'s>(pub &'s str); + // We reimplement this because the toml crate doesn't expose it, and // looking at the github issues etc. for that crate isn't encuraging. -pub fn toml_quote_string(s: &str) -> String { - let mut o = String::new(); - for c in s.chars() { - match c { - '"' | '\\'=> { o.push('\\'); o.push(c); }, - c if (c < ' ' && c != '\t') || c == '\x7f' => { - write!(o, r#"\u{:04x}"#, c as u32).unwrap(); - continue; +impl<'s> Display for TomlQuote<'s> { + #[throws(fmt::Error)] + fn fmt(&self, f: &mut fmt::Formatter) { + for c in self.0.chars() { + match c { + '"' | '\\'=> write!(f, "\\{}", c)?, + c if (c < ' ' && c != '\t') || c == '\x7f' => { + write!(f, r#"\u{:04x}"#, c as u32).unwrap(); + continue; + } + c => write!(f, "{}", c)?, } - c => o.push(c), } } - o } #[test] fn toml_quote_string_test(){ - assert_eq!(toml_quote_string(r#"w \ " ƒ."#), - r#"w \\ \" \u0007\u007fƒ."#); + assert_eq!(TomlQuote(r#"w \ " ƒ."#).to_string(), + r#"w \\ \" \u0007\u007fƒ."#); } pub fn toml_merge<'u,