1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#![warn(missing_docs)]
//! A simple library for getting random user agents from a list of popular browsers
//! such as Chrome, Firefox, Safari, Opera, Edge, and Internet Explorer.
//!
//! The user agents are hard-coded into the binary. They can be found [here](https://github.com/fake-useragent/fake-useragent/blob/master/src/fake_useragent/data/browsers.json).
//!
//! # Examples
//!
//! Get a random user agent from Chrome, Opera, Firefox, Safari, Edge, or Internet Explorer:
//! ```
//! use fake_user_agent::get_rua;
//! let rua = get_rua(); // &'static str
//! ```
//!
//! If you want a *specific type of browser* user agent, you can use the following:
//!
//! Get a random Chrome user agent:
//! ```
//! use fake_user_agent::get_chrome_rua;
//! let rua = get_chrome_rua(); // &'static str
//! ```
//!
//! Get a random Opera user agent:
//! ```
//! use fake_user_agent::get_opera_rua;
//! let rua = get_opera_rua(); // &'static str
//! ```
//!
//! Get a random Firefox user agent:
//! ```
//! use fake_user_agent::get_firefox_rua;
//! let rua = get_firefox_rua(); // &'static str
//! ```
//!
//! Get a random Safari user agent:
//! ```
//! use fake_user_agent::get_safari_rua;
//! let rua = get_safari_rua(); // &'static str
//! ```
//!
//! Get a random Edge user agent:   
//! ```
//! use fake_user_agent::get_edge_rua;
//! let rua = get_edge_rua(); // &'static str
//! ```
//!
//! Get a random Internet Explorer user agent:
//! ```
//! use fake_user_agent::get_ie_rua;
//! let rua = get_ie_rua(); // &'static str
//! ```

/// User agent module
mod user_agents;

/// Using fastrand for random number generation
extern crate fastrand;

/// Importing user agents
use user_agents::{
    CHROME_USER_AGENTS, EDGE_USER_AGENTS, FIREFOX_USER_AGENTS, IE_USER_AGENTS, OPERA_USER_AGENTS,
    SAFARI_USER_AGENTS,
};

/// Gets a random chrome user agent
pub fn get_chrome_rua() -> &'static str {
    let ri = fastrand::usize(..CHROME_USER_AGENTS.len());
    CHROME_USER_AGENTS[ri]
}

/// Gets a random opera user agent
pub fn get_opera_rua() -> &'static str {
    let ri = fastrand::usize(..OPERA_USER_AGENTS.len());
    OPERA_USER_AGENTS[ri]
}

/// Gets a random firefox user agent
pub fn get_firefox_rua() -> &'static str {
    let ri = fastrand::usize(..FIREFOX_USER_AGENTS.len());
    FIREFOX_USER_AGENTS[ri]
}

/// Gets a random safari user agent
pub fn get_safari_rua() -> &'static str {
    let ri = fastrand::usize(..SAFARI_USER_AGENTS.len());
    SAFARI_USER_AGENTS[ri]
}

/// Gets a random edge user agent
pub fn get_edge_rua() -> &'static str {
    let ri = fastrand::usize(..EDGE_USER_AGENTS.len());
    EDGE_USER_AGENTS[ri]
}

/// Gets a random internet explorer user agent
pub fn get_ie_rua() -> &'static str {
    let ri = fastrand::usize(..IE_USER_AGENTS.len());
    IE_USER_AGENTS[ri]
}

/// Gets a random user agent (Chrome, Opera, Firefox, Safari, Edge, or IE).
pub fn get_rua() -> &'static str {
    let browser = BrowserType::get_random();
    match browser {
        BrowserType::Chrome => get_chrome_rua(),
        BrowserType::Opera => get_opera_rua(),
        BrowserType::Firefox => get_firefox_rua(),
        BrowserType::Safari => get_safari_rua(),
        BrowserType::Edge => get_edge_rua(),
        BrowserType::IE => get_ie_rua(),
    }
}

enum BrowserType {
    Chrome,
    Opera,
    Firefox,
    Safari,
    Edge,
    IE,
}

impl BrowserType {
    pub fn get_random() -> Self {
        let random_number = fastrand::usize(..5);
        match random_number {
            0 => BrowserType::Chrome,
            1 => BrowserType::Opera,
            2 => BrowserType::Firefox,
            3 => BrowserType::Safari,
            4 => BrowserType::Edge,
            5 => BrowserType::IE,
            _ => unreachable!(),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_get_chrome_rua() {
        let rua = get_chrome_rua();
        println!("{}", rua);
        assert!(CHROME_USER_AGENTS.contains(&rua));
    }

    #[test]
    fn test_get_opera_rua() {
        let rua = get_opera_rua();
        assert!(OPERA_USER_AGENTS.contains(&rua));
    }

    #[test]
    fn test_get_firefox_rua() {
        let rua = get_firefox_rua();
        assert!(FIREFOX_USER_AGENTS.contains(&rua));
    }

    #[test]
    fn test_get_safari_rua() {
        let rua = get_safari_rua();
        assert!(SAFARI_USER_AGENTS.contains(&rua));
    }

    #[test]
    fn test_get_edge_rua() {
        let rua = get_edge_rua();
        assert!(EDGE_USER_AGENTS.contains(&rua));
    }

    #[test]
    fn test_get_ie_rua() {
        let rua = get_ie_rua();
        assert!(IE_USER_AGENTS.contains(&rua));
    }

    #[test]
    fn test_get_rua() {
        let rua = get_rua();
        assert!(
            CHROME_USER_AGENTS.contains(&rua)
                || OPERA_USER_AGENTS.contains(&rua)
                || FIREFOX_USER_AGENTS.contains(&rua)
                || SAFARI_USER_AGENTS.contains(&rua)
                || EDGE_USER_AGENTS.contains(&rua)
                || IE_USER_AGENTS.contains(&rua)
        );
    }
}