1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use percent_encoding::{percent_decode, percent_encode, AsciiSet, CONTROLS};

const NON_URL: &AsciiSet = &CONTROLS
    .add(b' ')
    .add(b'!')
    .add(b'"')
    .add(b'#')
    .add(b'$')
    .add(b'%')
    .add(b'&')
    .add(b'\'')
    .add(b'(')
    .add(b')')
    .add(b'*')
    .add(b'+')
    .add(b',')
    .add(b'-')
    //  .add(b':')
    .add(b';')
    .add(b'<')
    .add(b'=')
    .add(b'>')
    //  .add(b'?')
    .add(b'@')
    .add(b'[')
    .add(b'\\')
    .add(b']')
    .add(b'^')
    .add(b'_')
    .add(b'`')
    .add(b'{')
    .add(b'|')
    .add(b'}')
    .add(b'~');

pub fn url_encode(text: impl AsRef<str>) -> String {
    percent_encode(text.as_ref().as_bytes(), NON_URL).to_string()
}

pub fn url_decode(text: impl AsRef<str>) -> Option<String> {
    match percent_decode(text.as_ref().as_bytes()).decode_utf8() {
        Ok(cow) => Some(cow.to_string()),
        Err(_) => None,
    }
}
/*
pub fn html_encode() {

}

pub fn html_decode() {

}
*/