use crate::QUERY;
use percent_encoding::utf8_percent_encode;
use std::fmt::{self, Display, Formatter, Write};
pub(crate) struct EncodeWriter<'f, 'a> {
inner: &'f mut Formatter<'a>,
}
impl Write for EncodeWriter<'_, '_> {
fn write_str(&mut self, s: &str) -> fmt::Result {
for piece in utf8_percent_encode(s, QUERY) {
self.inner.write_str(piece)?;
}
Ok(())
}
}
pub(crate) fn write_encoded(f: &mut Formatter<'_>, value: &dyn Display) -> fmt::Result {
let mut writer = EncodeWriter { inner: f };
write!(writer, "{value}")
}
#[cfg(test)]
mod tests {
use super::*;
struct Chunked;
impl Display for Chunked {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.write_str("GrĂ¼n")?;
f.write_char('k')?;
f.write_str("ohl & more")
}
}
struct Wrapper(Chunked);
impl Display for Wrapper {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write_encoded(f, &self.0)
}
}
#[test]
fn test_chunked_encoding() {
assert_eq!(Wrapper(Chunked).to_string(), "Gr%C3%BCnkohl%20%26%20more");
}
}