easy_sqlite/
utils.rs

1unsafe fn change_borders(text: &mut str) {
2    let bts = text.as_bytes_mut();
3    bts[0] = b'\'';
4    bts[bts.len() - 1] = b'\'';
5}
6
7pub fn escape(src: &str) -> String {
8    let mut formatted = format!("{:?}", src).replace('\'', "\\d");
9    unsafe { change_borders(&mut formatted) }
10    formatted
11}
12
13// Tab is escaped as \t.
14// Carriage return is escaped as \r.
15// Line feed is escaped as \n.
16// Single quote is escaped as \'.
17// Double quote is escaped as \".
18// Backslash is escaped as \\.
19pub fn deescape(src: String) -> String {
20    let mut result = String::new();
21    let mut chars = src.chars();
22    while let Some(symbol) = chars.next() {
23        if symbol != '\\' {
24            result.push(symbol);
25            continue;
26        }
27        let next = match chars.next() {
28            Some(val) => val,
29            _ => break,
30        };
31        let val = match next {
32            't' => '\t',
33            'r' => '\r',
34            'n' => '\n',
35            'd' => '\'',
36            '"' => '"',
37            '0' => '\0',
38            '\\' => '\\',
39            _ => panic!("unexpected escaped sequence"),
40        };
41        result.push(val)
42    }
43    result
44}