unreal/impls/
address.rs

1use std::iter::once;
2
3use crate::Unreal;
4use crate::choose;
5use crate::data::address::{
6    COUNTRY, COUNTRY_ABR, STREET_NAME, STREET_PREFIX, STREET_SUFFIX, US_STATE, US_STATE_INITIALS,
7};
8use itertools::Itertools;
9use rand::Rng;
10use rand::RngCore;
11use rand::distributions::uniform::SampleRange;
12
13/// Generate random address data.
14impl<R: RngCore> Unreal<R> {
15    /// Return a random address with a [`Self::street`], [`Self::city`], [`Self::us_state`], and
16    /// [`Self::zip`].
17    pub fn address(&mut self) -> String {
18        format!(
19            "{}, {}, {} {}",
20            self.street(),
21            self.city(),
22            self.us_state(),
23            self.zip()
24        )
25    }
26
27    /// Return a random street name with a [`Self::street_number`], [`Self::street_prefix`],
28    /// [`Self::street_name`], and [`Self::street_suffix`].
29    pub fn street(&mut self) -> String {
30        once(self.street_number().as_str())
31            .chain(Some(self.street_prefix()).filter(|_| self.r#gen()))
32            .chain(once(self.street_name()))
33            .chain(once(self.street_suffix()))
34            .join(" ")
35    }
36
37    /// Return a random street number. The number is a random integer between 0 and 99,999, and
38    /// left-padded with zeroes to be never less than 3 digits long.
39    pub fn street_number(&mut self) -> String {
40        self.numbers(0..=99_999, 3)
41    }
42
43    choose! {
44        /// Return a random street prefix from the street prefix data set.
45        pub fn street_prefix(&mut self) from STREET_PREFIX;
46        /// Return a random street name from the street name data set.
47        pub fn street_name(&mut self) from STREET_NAME;
48        /// Return a random street suffix from the street suffix data set.
49        pub fn street_suffix(&mut self) from STREET_SUFFIX;
50        /// Return a random US state from the US state data set.
51        pub fn us_state(&mut self) from US_STATE;
52        /// Return a random US state abbreviation from the US state abbreviation data set.
53        pub fn us_state_initials(&mut self) from US_STATE_INITIALS;
54        /// Return a random country from the country data set.
55        pub fn country(&mut self) from COUNTRY;
56        /// Return a random country abbreviation from the country abbreviation data set.
57        pub fn country_abr(&mut self) from COUNTRY_ABR;
58    }
59
60    /// Return a random city name.
61    pub fn city(&mut self) -> String {
62        self.choose([
63            (|this: &mut Self| format!("{}{}", this.first_name(), this.street_suffix()))
64                as fn(&mut Self) -> String,
65            (|this: &mut Self| format!("{}{}", this.last_name(), this.street_suffix()))
66                as fn(&mut Self) -> String,
67            (|this: &mut Self| format!("{} {}", this.street_prefix(), this.last_name()))
68                as fn(&mut Self) -> String,
69        ])(self)
70    }
71
72    /// Return a random 5 digit zip code.
73    pub fn zip(&mut self) -> String {
74        self.digits(5)
75    }
76
77    /// Return a random latitude in `-90. ..=90.`.
78    pub fn latitude(&mut self) -> f32 {
79        self.gen_range(-90. ..=90.)
80    }
81
82    /// Return a random latitude in the given range, clamped to `-90. ..=90.`.
83    pub fn latitude_in_range(&mut self, range: impl SampleRange<f32>) -> f32 {
84        self.gen_range(range).clamp(-90., 90.)
85    }
86
87    /// Return a random longitude in `-180. ..=180.`.
88    pub fn longitude(&mut self) -> f32 {
89        self.gen_range(-180. ..=180.)
90    }
91
92    /// Return a random longitude in the given range, clamped to `-180. ..=180.`.
93    pub fn longitude_in_range(&mut self, range: impl SampleRange<f32>) -> f32 {
94        self.gen_range(range).clamp(-180., 180.)
95    }
96}