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<String> {
54 self.effective_gateway_url_owned()
55 }
56
57 pub fn effective_gateway_url_owned(&self) -> Option<String> {
59 if self.disabled {
60 return None;
61 }
62 std::env::var("LEAN_CTX_ENTERPRISE_GATEWAY_URL")
63 .ok()
64 .filter(|s| !s.is_empty())
65 .or_else(|| self.gateway_url.clone())
66 }
67
68 pub fn effective_token(&self) -> Option<String> {
70 if self.disabled {
71 return None;
72 }
73 std::env::var("LEAN_CTX_ENTERPRISE_TOKEN")
74 .ok()
75 .filter(|s| !s.is_empty())
76 .or_else(|| self.instance_token.clone())
77 }
78
79 pub fn effective_instance_id(&self) -> String {
81 if let Some(id) = &self.instance_id {
82 return id.clone();
83 }
84 gethostname::gethostname()
85 .into_string()
86 .unwrap_or_else(|_| "unknown".to_owned())
87 }
88
89 pub fn should_inject_headers(&self) -> bool {
91 if self.disabled {
92 return false;
93 }
94 self.always_inject_headers || self.gateway_url.is_some()
95 }
96}
97
98#[cfg(test)]
99mod tests {
100 use super::*;
101
102 #[test]
103 fn disabled_blocks_everything() {
104 let cfg = EnterpriseConfig {
105 gateway_url: Some("https://api.leanctx.com".to_owned()),
106 instance_token: Some("tok".to_owned()),
107 disabled: true,
108 ..Default::default()
109 };
110 assert_eq!(cfg.effective_gateway_url(), None);
111 assert_eq!(cfg.effective_token(), None);
112 assert!(!cfg.should_inject_headers());
113 }
114
115 #[test]
116 fn headers_injected_when_gateway_set() {
117 let cfg = EnterpriseConfig {
118 gateway_url: Some("https://api.leanctx.com".to_owned()),
119 ..Default::default()
120 };
121 assert!(cfg.should_inject_headers());
122 }
123
124 #[test]
125 fn always_inject_without_gateway() {
126 let cfg = EnterpriseConfig {
127 always_inject_headers: true,
128 ..Default::default()
129 };
130 assert!(cfg.should_inject_headers());
131 }
132
133 #[test]
134 fn instance_id_fallback() {
135 let cfg = EnterpriseConfig::default();
136 let id = cfg.effective_instance_id();
137 assert!(!id.is_empty(), "`id` is empty");
138 }
139}