uri_parsing_rs/parser/parsers/
port_parsers.rs

1use std::str::FromStr;
2
3use nom::character::complete::digit1;
4use nom::combinator::map;
5use nom::error::context;
6
7use crate::parser::parsers::{Elms, UResult};
8
9#[inline]
10pub(crate) fn port(i: Elms) -> UResult<Elms, u64> {
11  context(
12    "port",
13    map(digit1, |e: Elms| {
14      let s = e.as_str().unwrap();
15      u64::from_str(s).unwrap()
16    }),
17  )(i)
18}
19
20#[cfg(test)]
21pub mod gens {
22  use prop_check_rs::gen::{Gens, Gen};
23
24  pub fn port_gen() -> Gen<String> {
25    Gens::choose_u16(1, u16::MAX - 1).fmap(move |n| n.to_string())
26  }
27}
28
29#[cfg(test)]
30mod tests {
31  use std::env;
32
33  use anyhow::Result;
34  use prop_check_rs::prop;
35  use prop_check_rs::prop::TestCases;
36  use prop_check_rs::rng::RNG;
37
38  use super::*;
39  use super::gens::*;
40
41  const TEST_COUNT: TestCases = 100;
42
43  fn init() {
44    env::set_var("RUST_LOG", "debug");
45    let _ = env_logger::builder().is_test(true).try_init();
46  }
47
48  #[test]
49  fn test_port() -> Result<()> {
50    init();
51    let mut counter = 0;
52    let prop = prop::for_all(
53      || port_gen(),
54      move |s| {
55        counter += 1;
56        log::debug!("{:>03}, port = {}", counter, s);
57        let (_, port) = port(Elms::new(s.as_bytes())).ok().unwrap();
58        assert_eq!(port.to_string(), s);
59        true
60      },
61    );
62    prop::test_with_prop(prop, 5, TEST_COUNT, RNG::new())
63  }
64}