statsig_rust/evaluation/user_agent_parsing/
ua_parser.rs

1use 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}