oni_comb_uri_rs/parsers/
user_info_parsers.rs

1use crate::models::user_info::UserInfo;
2use crate::parsers::basic_parsers::*;
3use oni_comb_parser_rs::prelude::*;
4
5//  userinfo      = *( unreserved / pct-encoded / sub-delims / ":" )
6pub fn user_info<'a>() -> Parser<'a, u8, UserInfo> {
7  let p = || (unreserved().attempt() | pct_encoded().attempt() | sub_delims());
8  (p().of_many0().collect().map(|e| e.to_vec()).map_res(String::from_utf8)
9    + (elm(b':') * p().of_many1().collect().map(|e| e.to_vec()).map_res(String::from_utf8)).opt())
10  .map(|(user_name, password)| UserInfo::new(user_name, password))
11  .name("user_info")
12}
13
14#[cfg(test)]
15pub mod gens {
16  use prop_check_rs::gen::{Gen, Gens};
17
18  use crate::parsers::basic_parsers::gens::{pct_encoded_gen, repeat_gen_of_string, sub_delims_gen, unreserved_gen};
19
20  pub fn user_info_gen() -> Gen<String> {
21    let gen = {
22      repeat_gen_of_string(1, 5, {
23        Gens::frequency([(1, unreserved_gen(1)), (1, pct_encoded_gen()), (1, sub_delims_gen(1))])
24      })
25    };
26    Gens::one_bool().flat_map(move |b| {
27      let g = gen.clone();
28      if b {
29        gen
30          .clone()
31          .flat_map(move |s1| g.clone().map(move |s2| format!("{}:{}", s1, s2)))
32      } else {
33        gen.clone().map(|s| format!("{}", s))
34      }
35    })
36  }
37}
38
39#[cfg(test)]
40mod tests {
41  use std::env;
42
43  use anyhow::Result;
44  use prop_check_rs::prop;
45  use prop_check_rs::prop::TestCases;
46  use prop_check_rs::rng::RNG;
47
48  use super::gens::*;
49  use super::*;
50
51  const TEST_COUNT: TestCases = 100;
52
53  #[ctor::ctor]
54  fn init_logger() {
55    env::set_var("RUST_LOG", "debug");
56    let _ = env_logger::builder().is_test(true).try_init();
57  }
58
59  #[test]
60  fn test_user_info() -> Result<()> {
61    let mut counter = 0;
62    let prop = prop::for_all_gen(user_info_gen(), move |s| {
63      counter += 1;
64      log::debug!("{:>03}, user_info:string = {}", counter, s);
65      let input = s.as_bytes();
66      let result = (user_info() - end()).parse(input).to_result();
67      let user_info = result.unwrap();
68      log::debug!("{:>03}, user_info:object = {:?}", counter, user_info);
69      assert_eq!(user_info.to_string(), s);
70      true
71    });
72    prop::test_with_prop(prop, 5, TEST_COUNT, RNG::new())
73  }
74}