arbitrary/foreign/std/
net.rs

1use {
2    crate::{size_hint, Arbitrary, Result, Unstructured},
3    std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
4};
5
6impl<'a> Arbitrary<'a> for Ipv4Addr {
7    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
8        Ok(Ipv4Addr::from(u32::arbitrary(u)?))
9    }
10
11    #[inline]
12    fn size_hint(_depth: usize) -> (usize, Option<usize>) {
13        (4, Some(4))
14    }
15}
16
17impl<'a> Arbitrary<'a> for Ipv6Addr {
18    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
19        Ok(Ipv6Addr::from(u128::arbitrary(u)?))
20    }
21
22    #[inline]
23    fn size_hint(_depth: usize) -> (usize, Option<usize>) {
24        (16, Some(16))
25    }
26}
27
28impl<'a> Arbitrary<'a> for IpAddr {
29    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
30        if u.arbitrary()? {
31            Ok(IpAddr::V4(u.arbitrary()?))
32        } else {
33            Ok(IpAddr::V6(u.arbitrary()?))
34        }
35    }
36
37    fn size_hint(depth: usize) -> (usize, Option<usize>) {
38        size_hint::and(
39            bool::size_hint(depth),
40            size_hint::or(Ipv4Addr::size_hint(depth), Ipv6Addr::size_hint(depth)),
41        )
42    }
43}
44
45impl<'a> Arbitrary<'a> for SocketAddrV4 {
46    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
47        Ok(SocketAddrV4::new(u.arbitrary()?, u.arbitrary()?))
48    }
49
50    #[inline]
51    fn size_hint(depth: usize) -> (usize, Option<usize>) {
52        size_hint::and(Ipv4Addr::size_hint(depth), u16::size_hint(depth))
53    }
54}
55
56impl<'a> Arbitrary<'a> for SocketAddrV6 {
57    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
58        Ok(SocketAddrV6::new(
59            u.arbitrary()?,
60            u.arbitrary()?,
61            u.arbitrary()?,
62            u.arbitrary()?,
63        ))
64    }
65
66    #[inline]
67    fn size_hint(depth: usize) -> (usize, Option<usize>) {
68        size_hint::and(
69            Ipv6Addr::size_hint(depth),
70            size_hint::and(
71                u16::size_hint(depth),
72                size_hint::and(u32::size_hint(depth), u32::size_hint(depth)),
73            ),
74        )
75    }
76}
77
78impl<'a> Arbitrary<'a> for SocketAddr {
79    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
80        if u.arbitrary()? {
81            Ok(SocketAddr::V4(u.arbitrary()?))
82        } else {
83            Ok(SocketAddr::V6(u.arbitrary()?))
84        }
85    }
86
87    fn size_hint(depth: usize) -> (usize, Option<usize>) {
88        size_hint::and(
89            bool::size_hint(depth),
90            size_hint::or(
91                SocketAddrV4::size_hint(depth),
92                SocketAddrV6::size_hint(depth),
93            ),
94        )
95    }
96}