1use crate::constants::env::ai;
6use once_cell::sync::Lazy;
7use std::sync::Mutex;
8
9#[derive(Debug, Clone, Default)]
11pub struct GitHubActionsMetadata {
12 pub actor: Option<String>,
13 pub actor_id: Option<String>,
14 pub repository: Option<String>,
15 pub repository_id: Option<String>,
16 pub repository_owner: Option<String>,
17 pub repository_owner_id: Option<String>,
18}
19
20#[derive(Debug, Clone)]
22pub struct CoreUserData {
23 pub device_id: String,
24 pub session_id: String,
25 pub email: Option<String>,
26 pub app_version: String,
27 pub platform: String,
28 pub organization_uuid: Option<String>,
29 pub account_uuid: Option<String>,
30 pub user_type: Option<String>,
31 pub subscription_type: Option<String>,
32 pub rate_limit_tier: Option<String>,
33 pub first_token_time: Option<i64>,
34 pub github_actions_metadata: Option<GitHubActionsMetadata>,
35}
36
37#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39pub enum Platform {
40 MacOS,
41 Linux,
42 Windows,
43 Unknown,
44}
45
46impl Platform {
47 pub fn from_str(s: &str) -> Self {
48 match s {
49 "darwin" => Platform::MacOS,
50 "linux" => Platform::Linux,
51 "win32" => Platform::Windows,
52 _ => Platform::Unknown,
53 }
54 }
55}
56
57static CORE_USER_DATA: Lazy<Mutex<Option<CoreUserData>>> = Lazy::new(|| Mutex::new(None));
59
60pub fn reset_user_cache() {
62 let mut data = CORE_USER_DATA.lock().unwrap();
63 *data = None;
64}
65
66pub fn get_core_user_data(_include_analytics_metadata: bool) -> CoreUserData {
68 CoreUserData {
71 device_id: String::new(),
72 session_id: String::new(),
73 email: None,
74 app_version: env!("CARGO_PKG_VERSION").to_string(),
75 platform: std::env::consts::OS.to_string(),
76 organization_uuid: None,
77 account_uuid: None,
78 user_type: std::env::var(ai::USER_TYPE).ok(),
79 subscription_type: None,
80 rate_limit_tier: None,
81 first_token_time: None,
82 github_actions_metadata: None,
83 }
84}
85
86pub fn get_user_for_analytics() -> CoreUserData {
88 get_core_user_data(true)
89}
90
91pub fn get_git_email() -> Option<String> {
93 std::process::Command::new("git")
95 .args(["config", "--get", "user.email"])
96 .output()
97 .ok()
98 .and_then(|output| {
99 if output.status.success() {
100 let email = String::from_utf8_lossy(&output.stdout).trim().to_string();
101 if !email.is_empty() {
102 return Some(email);
103 }
104 }
105 None
106 })
107}
108
109pub fn set_cached_email(_email: Option<String>) {
111 }