statsig_rust/evaluation/user_agent_parsing/
ua_parser.rs1use crate::evaluation::dynamic_string::DynamicString;
2use crate::user::StatsigUserInternal;
3use crate::{log_w, DynamicValue};
4
5use super::experimental_ua_parser::ExperimentalUserAgentParser;
6use super::third_party_ua_parser::ThirdPartyUserAgentParser;
7
8lazy_static::lazy_static! {
9 static ref USER_AGENT_STRING: Option<DynamicString> = Some(DynamicString::from("userAgent".to_string()));
10}
11
12const TAG: &str = "UserAgentParser";
13const UNINITIALIZED_REASON: &str = "UAParserNotLoaded";
14
15pub struct UserAgentParser;
16
17impl UserAgentParser {
18 pub fn get_value_from_user_agent(
19 user: &StatsigUserInternal,
20 field: &Option<DynamicString>,
21 override_reason: &mut Option<&str>,
22 use_experimental_ua_parser: bool,
23 ) -> Option<DynamicValue> {
24 let field_lowered = match field {
25 Some(f) => f.lowercased_value.as_str(),
26 _ => return None,
27 };
28
29 let user_agent = match user.get_user_value(&USER_AGENT_STRING) {
30 Some(v) => match &v.string_value {
31 Some(s) => &s.value,
32 _ => return None,
33 },
34 None => return None,
35 };
36
37 if user_agent.len() > 1000 {
38 return None;
39 }
40
41 if use_experimental_ua_parser {
42 ExperimentalUserAgentParser::get_value_from_user_agent(field_lowered, user_agent)
43 } else {
44 let result =
45 ThirdPartyUserAgentParser::get_value_from_user_agent(field_lowered, user_agent);
46
47 match result {
48 Ok(v) => v,
49 Err(_) => {
50 *override_reason = Some(UNINITIALIZED_REASON);
51 log_w!(TAG, "Failed to load UA Parser. Check StatsigOptions.disable_user_agent_parsing and or wait_for_user_agent_init");
52 None
53 }
54 }
55 }
56 }
57
58 pub fn load_parser() {
59 ThirdPartyUserAgentParser::load_parser();
60 }
61}