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
}