email_encoding/headers/
hex_encoding.rs

1use core::fmt::{self, Write};
2
3use super::{hex, utils, writer::EmailWriter};
4
5pub(super) fn percent_encode_char(w: &mut EmailWriter<'_>, to_append: char) -> fmt::Result {
6    encode_char(w, '%', to_append)
7}
8
9fn encode_char(w: &mut EmailWriter<'_>, prefix: char, to_append: char) -> fmt::Result {
10    if utils::char_is_ascii_alphanumeric_plus(to_append) {
11        w.write_char(to_append)?;
12    } else {
13        let mut dst = [0; 4];
14        let written = to_append.encode_utf8(&mut dst).len();
15
16        encode_byte(w, prefix, dst[0])?;
17
18        // Manually unrolled loop over `dst`
19        if written >= 2 {
20            encode_byte(w, prefix, dst[1])?;
21
22            if written >= 3 {
23                encode_byte(w, prefix, dst[2])?;
24
25                if written >= 4 {
26                    encode_byte(w, prefix, dst[3])?;
27                }
28            }
29        }
30    }
31
32    Ok(())
33}
34
35fn encode_byte(w: &mut EmailWriter<'_>, prefix: char, to_append: u8) -> fmt::Result {
36    let chars = hex::encode_byte(to_append);
37    w.write_char(prefix)?;
38    w.write_char(char::from(chars[0]))?;
39    w.write_char(char::from(chars[1]))?;
40
41    Ok(())
42}