use std::fmt;
use super::BoundedUriWriter;
pub(crate) struct UriComponentWriter<'a> {
rendered: &'a mut BoundedUriWriter,
}
impl UriComponentWriter<'_> {
pub(crate) fn new(rendered: &mut BoundedUriWriter) -> UriComponentWriter<'_> {
UriComponentWriter { rendered }
}
}
impl fmt::Write for UriComponentWriter<'_> {
fn write_str(&mut self, value: &str) -> fmt::Result {
if write_uri_component(value, self.rendered) {
Ok(())
} else {
Err(fmt::Error)
}
}
}
fn write_uri_component(value: &str, rendered: &mut BoundedUriWriter) -> bool {
for byte in value.bytes() {
if byte.is_ascii_alphanumeric()
|| matches!(
byte,
b'-' | b'.' | b'_' | b'~' | b'!' | b'$' | b'\'' | b'(' | b')' | b'*' | b'+' | b',' | b';' | b'=' | b':'
)
{
let mut buffer = [0_u8; 4];
if !rendered.write_str(char::from(byte).encode_utf8(&mut buffer)) {
return false;
}
} else if !rendered.write_percent_encoded(byte) {
return false;
}
}
true
}