media_type_impl_utils/quoted_string/
http.rs

1use lut::{Table};
2use lookup_tables::{
3    MediaTypeChars,
4    QTextWs,
5    HttpToken
6};
7use qs::error::CoreError;
8use qs::spec::{
9    PartialCodePoint,
10    ParsingImpl,
11    State,
12    WithoutQuotingValidator,
13};
14
15/// a zero-sized type to provide a `ParsingImpl` for media types wrt. the (obs) Http grammar
16#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default)]
17pub struct HttpObsParsingImpl;
18
19impl ParsingImpl for HttpObsParsingImpl {
20
21    /// any qtext, ws and non-us-ascii char can be quoted
22    fn can_be_quoted(bch: PartialCodePoint) -> bool {
23        let idx = bch.as_u8() as usize;
24        idx > 0x7f || MediaTypeChars::check_at(idx, QTextWs)
25    }
26    /// any qtext, ws and non-us-ascii char can appear without quoting, and
27    /// all chars are semantic relevant (emit=true)
28    fn handle_normal_state(bch: PartialCodePoint) -> Result<(State<Self>, bool), CoreError> {
29        let idx = bch.as_u8() as usize;
30        if idx > 0x7f || MediaTypeChars::check_at(idx, QTextWs) {
31            Ok((State::Normal, true))
32        } else {
33            Err(CoreError::InvalidChar)
34        }
35    }
36}
37
38/// a zero-sized type to provide a `WithoutQuotingValidator` impl for tokens (http grammar)
39#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default)]
40pub struct HttpTokenValidator;
41
42impl HttpTokenValidator {
43    /// create a new HttpTokenValidator
44    pub fn new() -> Self {
45        Default::default()
46    }
47}
48
49impl WithoutQuotingValidator for HttpTokenValidator {
50    fn next(&mut self, pcp: PartialCodePoint) -> bool {
51        MediaTypeChars::check_at(pcp.as_u8() as usize, HttpToken)
52    }
53
54    fn end(&self) -> bool {
55        true
56    }
57}