percent_encoding_command/
lib.rs1use anyhow::Result;
2use percent_encoding::{percent_decode_str, utf8_percent_encode, NON_ALPHANUMERIC};
3use std::io::{Read, Write};
4
5pub fn encode(reader: &mut dyn Read, writer: &mut dyn Write) -> Result<()> {
6 let mut input = String::new();
7 reader.read_to_string(&mut input)?;
8 let encoded = utf8_percent_encode(&input, NON_ALPHANUMERIC).to_string();
9 writer.write_all(encoded.as_bytes())?;
10 Ok(())
11}
12
13pub fn decode(reader: &mut dyn Read, writer: &mut dyn Write) -> Result<()> {
14 let mut input = String::new();
15 reader.read_to_string(&mut input)?;
16 let decoded = percent_decode_str(&input).decode_utf8()?.to_string();
17 writer.write_all(decoded.as_bytes())?;
18 Ok(())
19}
20
21#[cfg(test)]
22mod tests {
23 use super::*;
24
25 #[test]
26 fn encode_works() {
27 let mut reader = "hello world 你好".as_bytes();
28 let mut writer = vec![];
29 encode(&mut reader, &mut writer).expect("unexpected encode error");
30 let result = std::str::from_utf8(&writer).unwrap();
31 let expected = "hello%20world%20%E4%BD%A0%E5%A5%BD";
32 assert_eq!(result, expected);
33 }
34
35 #[test]
36 fn decode_works() {
37 let mut reader = "hello%20world%20%E4%BD%A0%E5%A5%BD".as_bytes();
38 let mut writer = vec![];
39 decode(&mut reader, &mut writer).expect("unexpected decode error");
40 let result = std::str::from_utf8(&writer).unwrap();
41 let expected = "hello world 你好";
42 assert_eq!(result, expected);
43 }
44}