percent_encoding_command/
lib.rs

1use 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}