lean_ctx/core/config/
enterprise.rs1use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
19#[serde(default)]
20pub struct EnterpriseConfig {
21 #[serde(default, skip_serializing_if = "Option::is_none")]
26 pub gateway_url: Option<String>,
27
28 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub instance_token: Option<String>,
32
33 #[serde(default, skip_serializing_if = "Option::is_none")]
37 pub instance_id: Option<String>,
38
39 #[serde(default)]
44 pub always_inject_headers: bool,
45
46 #[serde(default)]
48 pub disabled: bool,
49}
50
51impl EnterpriseConfig {
52 pub fn effective_gateway_url(&self) -> Option<&str> {
54 if self.disabled {
55 return None;
56 }
57 if let Ok(env_url) = std::env::var("LEAN_CTX_ENTERPRISE_GATEWAY_URL") {
58 if !env_url.is_empty() {
59 return self.gateway_url.as_deref();
62 }
63 }
64 self.gateway_url.as_deref()
65 }
66
67 pub fn effective_gateway_url_owned(&self) -> Option<String> {
69 if self.disabled {
70 return None;
71 }
72 std::env::var("LEAN_CTX_ENTERPRISE_GATEWAY_URL")
73 .ok()
74 .filter(|s| !s.is_empty())
75 .or_else(|| self.gateway_url.clone())
76 }
77
78 pub fn effective_token(&self) -> Option<String> {
80 if self.disabled {
81 return None;
82 }
83 std::env::var("LEAN_CTX_ENTERPRISE_TOKEN")
84 .ok()
85 .filter(|s| !s.is_empty())
86 .or_else(|| self.instance_token.clone())
87 }
88
89 pub fn effective_instance_id(&self) -> String {
91 if let Some(id) = &self.instance_id {
92 return id.clone();
93 }
94 gethostname::gethostname()
95 .into_string()
96 .unwrap_or_else(|_| "unknown".to_owned())
97 }
98
99 pub fn should_inject_headers(&self) -> bool {
101 if self.disabled {
102 return false;
103 }
104 self.always_inject_headers || self.gateway_url.is_some()
105 }
106}
107
108#[cfg(test)]
109mod tests {
110 use super::*;
111
112 #[test]
113 fn disabled_blocks_everything() {
114 let cfg = EnterpriseConfig {
115 gateway_url: Some("https://api.leanctx.com".to_owned()),
116 instance_token: Some("tok".to_owned()),
117 disabled: true,
118 ..Default::default()
119 };
120 assert_eq!(cfg.effective_gateway_url(), None);
121 assert_eq!(cfg.effective_token(), None);
122 assert!(!cfg.should_inject_headers());
123 }
124
125 #[test]
126 fn headers_injected_when_gateway_set() {
127 let cfg = EnterpriseConfig {
128 gateway_url: Some("https://api.leanctx.com".to_owned()),
129 ..Default::default()
130 };
131 assert!(cfg.should_inject_headers());
132 }
133
134 #[test]
135 fn always_inject_without_gateway() {
136 let cfg = EnterpriseConfig {
137 always_inject_headers: true,
138 ..Default::default()
139 };
140 assert!(cfg.should_inject_headers());
141 }
142
143 #[test]
144 fn instance_id_fallback() {
145 let cfg = EnterpriseConfig::default();
146 let id = cfg.effective_instance_id();
147 assert!(!id.is_empty());
148 }
149}