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}