uri_parsing_rs/parser/parsers/
port_parsers.rs1use 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}