summaryrefslogtreecommitdiffstats
path: root/third_party/rust/sfv/src/utils.rs
blob: 7eb79340bad716fd863dfe4a247e29774dee030f (plain)
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
use data_encoding::{Encoding, Specification};
use std::iter::Peekable;
use std::str::Chars;

pub(crate) fn base64() -> Result<Encoding, &'static str> {
    let mut spec = Specification::new();
    spec.check_trailing_bits = false;
    spec.symbols
        .push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
    spec.padding = None;
    spec.ignore = "=".to_owned();
    spec.encoding()
        .map_err(|_err| "invalid base64 specification")
}

pub(crate) fn is_tchar(c: char) -> bool {
    // See tchar values list in https://tools.ietf.org/html/rfc7230#section-3.2.6
    let tchars = "!#$%&'*+-.^_`|~";
    tchars.contains(c) || c.is_ascii_alphanumeric()
}

pub(crate) fn is_allowed_b64_content(c: char) -> bool {
    c.is_ascii_alphanumeric() || c == '+' || c == '=' || c == '/'
}

pub(crate) fn consume_ows_chars(input_chars: &mut Peekable<Chars>) {
    while let Some(c) = input_chars.peek() {
        if c == &' ' || c == &'\t' {
            input_chars.next();
        } else {
            break;
        }
    }
}

pub(crate) fn consume_sp_chars(input_chars: &mut Peekable<Chars>) {
    while let Some(c) = input_chars.peek() {
        if c == &' ' {
            input_chars.next();
        } else {
            break;
        }
    }
}