systemprompt-analytics 0.1.21

Analytics module for systemprompt.io - session tracking, metrics, and reporting
Documentation
pub fn parse_user_agent(ua: &str) -> (Option<String>, Option<String>, Option<String>) {
    let ua_lower = ua.to_lowercase();

    let device_type = Some(parse_device_type(&ua_lower));
    let browser = Some(parse_browser(&ua_lower));
    let os = Some(parse_os(&ua_lower));

    (device_type, browser, os)
}

fn parse_device_type(ua_lower: &str) -> String {
    if ua_lower.contains("mobile") || ua_lower.contains("android") || ua_lower.contains("iphone") {
        "mobile".to_string()
    } else if ua_lower.contains("tablet") || ua_lower.contains("ipad") {
        "tablet".to_string()
    } else {
        "desktop".to_string()
    }
}

fn parse_browser(ua_lower: &str) -> String {
    if ua_lower.contains("edg/") || ua_lower.contains("edge") {
        "Edge".to_string()
    } else if ua_lower.contains("samsungbrowser") {
        "Samsung Internet".to_string()
    } else if ua_lower.contains("ucbrowser") || ua_lower.contains("ucweb") {
        "UC Browser".to_string()
    } else if ua_lower.contains("yabrowser") {
        "Yandex".to_string()
    } else if ua_lower.contains("qqbrowser") {
        "QQ Browser".to_string()
    } else if ua_lower.contains("micromessenger") {
        "WeChat".to_string()
    } else if ua_lower.contains("silk/") {
        "Silk".to_string()
    } else if ua_lower.contains("electron") {
        "Electron".to_string()
    } else if ua_lower.contains("cordova") || ua_lower.contains("wv)") {
        "WebView".to_string()
    } else if ua_lower.contains("chrome") && !ua_lower.contains("edg") {
        "Chrome".to_string()
    } else if ua_lower.contains("firefox") {
        "Firefox".to_string()
    } else if ua_lower.contains("safari") && !ua_lower.contains("chrome") {
        "Safari".to_string()
    } else if ua_lower.contains("opera") || ua_lower.contains("opr/") {
        "Opera".to_string()
    } else if ua_lower.contains("msie") || ua_lower.contains("trident") {
        "IE".to_string()
    } else if ua_lower.contains("brave") {
        "Brave".to_string()
    } else if ua_lower.contains("vivaldi") {
        "Vivaldi".to_string()
    } else if ua_lower.contains("duckduckgo") {
        "DuckDuckGo".to_string()
    } else if ua_lower.contains("arc/") {
        "Arc".to_string()
    } else {
        "Other".to_string()
    }
}

fn parse_os(ua_lower: &str) -> String {
    if ua_lower.contains("windows") {
        "Windows".to_string()
    } else if ua_lower.contains("mac os x") || ua_lower.contains("macos") {
        "macOS".to_string()
    } else if ua_lower.contains("android") {
        "Android".to_string()
    } else if ua_lower.contains("iphone") || ua_lower.contains("ipad") || ua_lower.contains("ios") {
        "iOS".to_string()
    } else if ua_lower.contains("linux") {
        "Linux".to_string()
    } else if ua_lower.contains("cros") || ua_lower.contains("chrome os") {
        "ChromeOS".to_string()
    } else if ua_lower.contains("freebsd") || ua_lower.contains("openbsd") {
        "BSD".to_string()
    } else {
        "Other".to_string()
    }
}