1 use crate::faker::internet::raw::*;
2 use crate::faker::lorem::raw::Word;
3 use crate::faker::name::raw::FirstName;
4 use crate::locales::{Data, EN};
5 use crate::{Dummy, Fake, Faker};
6 use rand::distributions::{Distribution, Uniform};
7 use rand::seq::SliceRandom;
8 use rand::Rng;
9 use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
10 
11 impl<L: Data> Dummy<FreeEmailProvider<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(_: &FreeEmailProvider<L>, rng: &mut R) -> Self12     fn dummy_with_rng<R: Rng + ?Sized>(_: &FreeEmailProvider<L>, rng: &mut R) -> Self {
13         let s = *L::INTERNET_FREE_EMAIL_PROVIDER.choose(rng).unwrap();
14         s.into()
15     }
16 }
17 
18 impl<L: Data> Dummy<FreeEmailProvider<L>> for &str {
dummy_with_rng<R: Rng + ?Sized>(_: &FreeEmailProvider<L>, rng: &mut R) -> Self19     fn dummy_with_rng<R: Rng + ?Sized>(_: &FreeEmailProvider<L>, rng: &mut R) -> Self {
20         *L::INTERNET_FREE_EMAIL_PROVIDER.choose(rng).unwrap()
21     }
22 }
23 
24 impl<L: Data> Dummy<DomainSuffix<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(_: &DomainSuffix<L>, rng: &mut R) -> Self25     fn dummy_with_rng<R: Rng + ?Sized>(_: &DomainSuffix<L>, rng: &mut R) -> Self {
26         let s = *L::INTERNET_DOMAIN_SUFFIX.choose(rng).unwrap();
27         s.into()
28     }
29 }
30 
31 impl<L: Data> Dummy<DomainSuffix<L>> for &str {
dummy_with_rng<R: Rng + ?Sized>(_: &DomainSuffix<L>, rng: &mut R) -> Self32     fn dummy_with_rng<R: Rng + ?Sized>(_: &DomainSuffix<L>, rng: &mut R) -> Self {
33         *L::INTERNET_DOMAIN_SUFFIX.choose(rng).unwrap()
34     }
35 }
36 
37 impl<L: Data + Copy> Dummy<FreeEmail<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(c: &FreeEmail<L>, rng: &mut R) -> Self38     fn dummy_with_rng<R: Rng + ?Sized>(c: &FreeEmail<L>, rng: &mut R) -> Self {
39         let username: String = Username(c.0).fake_with_rng(rng);
40         let provider: String = FreeEmailProvider(c.0).fake_with_rng(rng);
41         format!("{}@{}", username, provider)
42     }
43 }
44 
45 impl<L: Data + Copy> Dummy<SafeEmail<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(_: &SafeEmail<L>, rng: &mut R) -> Self46     fn dummy_with_rng<R: Rng + ?Sized>(_: &SafeEmail<L>, rng: &mut R) -> Self {
47         let username: String = FirstName(EN).fake_with_rng::<&str, _>(rng).to_lowercase();
48         let domain = ["com", "net", "org"].choose(rng).unwrap();
49         format!("{}@example.{}", username, domain)
50     }
51 }
52 
53 impl<L: Data> Dummy<Username<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(_: &Username<L>, rng: &mut R) -> Self54     fn dummy_with_rng<R: Rng + ?Sized>(_: &Username<L>, rng: &mut R) -> Self {
55         match Faker.fake_with_rng::<u8, _>(rng) {
56             0 => FirstName(EN).fake_with_rng::<&str, _>(rng).to_lowercase(),
57             1 | 2 => format!(
58                 "{}.{}",
59                 Word(EN).fake_with_rng::<&str, _>(rng),
60                 FirstName(EN).fake_with_rng::<&str, _>(rng).to_lowercase()
61             ),
62             3 | 4 => format!(
63                 "{}{}",
64                 FirstName(EN).fake_with_rng::<&str, _>(rng).to_lowercase(),
65                 Faker.fake_with_rng::<u8, _>(rng)
66             ),
67             _ => format!(
68                 "{}_{}",
69                 FirstName(EN).fake_with_rng::<&str, _>(rng).to_lowercase(),
70                 Word(EN).fake_with_rng::<&str, _>(rng),
71             ),
72         }
73     }
74 }
75 
76 impl<L: Data> Dummy<Password<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(c: &Password<L>, rng: &mut R) -> Self77     fn dummy_with_rng<R: Rng + ?Sized>(c: &Password<L>, rng: &mut R) -> Self {
78         let len: usize = c.1.fake_with_rng(rng);
79         let s: Option<String> = (0..len)
80             .map(|_| Some(*L::INTERNET_PASSWORD_CHARS.choose(rng)?))
81             .collect();
82         s.unwrap_or_default()
83     }
84 }
85 
86 impl<L: Data> Dummy<IPv4<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(_: &IPv4<L>, rng: &mut R) -> Self87     fn dummy_with_rng<R: Rng + ?Sized>(_: &IPv4<L>, rng: &mut R) -> Self {
88         let u = Uniform::new_inclusive(u8::min_value(), u8::max_value());
89         format!(
90             "{}.{}.{}.{}",
91             u.sample(rng),
92             u.sample(rng),
93             u.sample(rng),
94             u.sample(rng),
95         )
96     }
97 }
98 
99 impl<L: Data> Dummy<IPv4<L>> for Ipv4Addr {
100     #[inline]
dummy_with_rng<R: Rng + ?Sized>(_: &IPv4<L>, rng: &mut R) -> Self101     fn dummy_with_rng<R: Rng + ?Sized>(_: &IPv4<L>, rng: &mut R) -> Self {
102         Faker.fake_with_rng::<Ipv4Addr, _>(rng)
103     }
104 }
105 
106 impl<L: Data> Dummy<IPv6<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(_: &IPv6<L>, rng: &mut R) -> Self107     fn dummy_with_rng<R: Rng + ?Sized>(_: &IPv6<L>, rng: &mut R) -> Self {
108         let u = Uniform::new_inclusive(u16::min_value(), u16::max_value());
109         format!(
110             "{:X}:{:X}:{:X}:{:X}:{:X}:{:X}:{:X}:{:X}",
111             u.sample(rng),
112             u.sample(rng),
113             u.sample(rng),
114             u.sample(rng),
115             u.sample(rng),
116             u.sample(rng),
117             u.sample(rng),
118             u.sample(rng),
119         )
120     }
121 }
122 
123 impl<L: Data> Dummy<IPv6<L>> for Ipv6Addr {
124     #[inline]
dummy_with_rng<R: Rng + ?Sized>(_: &IPv6<L>, rng: &mut R) -> Self125     fn dummy_with_rng<R: Rng + ?Sized>(_: &IPv6<L>, rng: &mut R) -> Self {
126         Faker.fake_with_rng::<Ipv6Addr, _>(rng)
127     }
128 }
129 
130 impl<L: Data> Dummy<IP<L>> for IpAddr {
131     #[inline]
dummy_with_rng<R: Rng + ?Sized>(_: &IP<L>, rng: &mut R) -> Self132     fn dummy_with_rng<R: Rng + ?Sized>(_: &IP<L>, rng: &mut R) -> Self {
133         Faker.fake_with_rng::<IpAddr, _>(rng)
134     }
135 }
136 
137 impl<L: Data> Dummy<MACAddress<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(_: &MACAddress<L>, rng: &mut R) -> Self138     fn dummy_with_rng<R: Rng + ?Sized>(_: &MACAddress<L>, rng: &mut R) -> Self {
139         let u = Uniform::new_inclusive(u8::min_value(), u8::max_value());
140         format!(
141             "{:02X}:{:02X}:{:02X}:{:02X}:{:02X}:{:02X}",
142             u.sample(rng),
143             u.sample(rng),
144             u.sample(rng),
145             u.sample(rng),
146             u.sample(rng),
147             u.sample(rng),
148         )
149     }
150 }
151 
152 impl<L: Data> Dummy<Color<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(_: &Color<L>, rng: &mut R) -> Self153     fn dummy_with_rng<R: Rng + ?Sized>(_: &Color<L>, rng: &mut R) -> Self {
154         let u = Uniform::new_inclusive(u8::min_value(), u8::max_value());
155         format!(
156             "#{:02X}{:02X}{:02X}",
157             u.sample(rng),
158             u.sample(rng),
159             u.sample(rng),
160         )
161     }
162 }
163 
164 impl<L: Data> Dummy<UserAgent<L>> for String {
dummy_with_rng<R: Rng + ?Sized>(_: &UserAgent<L>, rng: &mut R) -> Self165     fn dummy_with_rng<R: Rng + ?Sized>(_: &UserAgent<L>, rng: &mut R) -> Self {
166         let s = *L::INTERNET_USER_AGENT.choose(rng).unwrap();
167         s.into()
168     }
169 }
170 
171 impl<L: Data> Dummy<UserAgent<L>> for &str {
dummy_with_rng<R: Rng + ?Sized>(_: &UserAgent<L>, rng: &mut R) -> Self172     fn dummy_with_rng<R: Rng + ?Sized>(_: &UserAgent<L>, rng: &mut R) -> Self {
173         *L::INTERNET_USER_AGENT.choose(rng).unwrap()
174     }
175 }
176