email_encoding/headers/
hex_encoding.rs1use 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 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}