apisix_admin_client/
config.rs1use crate::{Result};
2use std::env;
3use std::sync::OnceLock;
4use crate::error::ApisixClientError;
5
6pub fn config() -> &'static ApisixConfig {
8 static INSTANCE: OnceLock<ApisixConfig> = OnceLock::new();
9
10 INSTANCE.get_or_init(|| {
11 ApisixConfig::load_from_env().unwrap_or_else(|e| {
12 panic!("FATAL - WHILE LOADING CONF - Cause: {e:?}");
13 })
14 })
15}
16
17#[derive(Debug, Clone)]
19pub struct ApisixConfig {
20 pub url: String,
21 pub admin_url: String,
22 pub control_url: String,
23 pub admin_apikey: String,
24 pub client_request_timeout: u64,
25}
26
27impl From<ApisixConfig> for ApisixConfigBuilder {
28 fn from(config: ApisixConfig) -> Self {
29 ApisixConfigBuilder {
30 url: Some(config.url),
31 admin_url: Some(config.admin_url),
32 control_url: Some(config.control_url),
33 admin_apikey: Some(config.admin_apikey),
34 client_request_timeout: Some(config.client_request_timeout),
35 }
36 }
37}
38
39#[derive(Default, Debug, Clone)]
54pub struct ApisixConfigBuilder {
55 url: Option<String>,
56 admin_url: Option<String>,
57 control_url: Option<String>,
58 admin_apikey: Option<String>,
59 client_request_timeout: Option<u64>,
60}
61
62impl ApisixConfigBuilder {
63 pub fn new() -> Self {
64 ApisixConfig::default().into() }
66
67 pub fn with_url(&mut self, url: impl Into<String>) -> &mut Self {
68 let _ = self.url.insert(url.into());
69 self
70 }
71
72 pub fn with_admin_url(&mut self, admin_url: impl Into<String>) -> &mut Self {
73 let _ = self.admin_url.insert(admin_url.into());
74 self
75 }
76
77 pub fn with_control_url(&mut self, control_url: impl Into<String>) -> &mut Self {
78 let _ = self.control_url.insert(control_url.into());
79 self
80 }
81
82 pub fn with_admin_path(&mut self, admin_path: impl Into<String>) -> &mut Self {
83 let _ = self.admin_apikey.insert(admin_path.into());
84 self
85 }
86
87 pub fn with_client_request_timeout(&mut self, client_request_timeout: u64) -> &mut Self {
88 let _ = self.client_request_timeout.insert(client_request_timeout);
89 self
90 }
91
92 pub fn build(&self) -> Result<ApisixConfig> {
93 Ok(ApisixConfig {
94 url: self.url.clone().ok_or(ApisixClientError::ConfigMissingException("url"))?,
95 admin_url: self.admin_url.clone().ok_or(ApisixClientError::ConfigMissingException("admin_url"))?,
96 control_url: self.control_url.clone().ok_or(ApisixClientError::ConfigMissingException("control_url"))?,
97 admin_apikey: self.admin_apikey.clone().ok_or(ApisixClientError::ConfigMissingException("admin_path"))?,
98 client_request_timeout: self.client_request_timeout.ok_or(ApisixClientError::ConfigMissingException("admin_path"))?,
99 })
100 }
101
102}
103impl Default for ApisixConfig {
108 fn default() -> Self {
109 Self {
110 url: String::from("http://localhost:9080"),
111 admin_url: "http://localhost:9180".to_string(),
112 control_url: "http://localhost:9090".to_string(),
113 admin_apikey: "edd1c9f034335f136f87ad84b625c8f1".to_string(),
114 client_request_timeout: 30000,
115 }
116 }
117}
118
119impl ApisixConfig {
121 pub fn from_env() -> Self {
122 Self::load_from_env().expect("Failed to initialize Apisix Client or load SmartIDConfig from env")
123 }
124}
125
126impl ApisixConfig {
127 pub fn load_from_env() -> Result<ApisixConfig> {
128 Ok(ApisixConfig {
129 url: get_env("APISIX_URL")?,
130 admin_url: get_env("APISIX_ADMIN_URL")?,
131 control_url: get_env("APISIX_CONTROL_URL")?,
132 admin_apikey: get_env("APISIX_ADMIN_API_KEY")?,
133 client_request_timeout: get_env_u64("CLIENT_REQ_NETWORK_TIMEOUT_MILLIS")?,
134 })
135 }
136}
137
138fn get_env(name: &'static str) -> Result<String> {
139 env::var(name).map_err(|_| ApisixClientError::ConfigMissingException(name))
140}
141
142fn get_env_u64(name: &'static str) -> Result<u64> {
143 env::var(name).unwrap().parse().map_err(|_| ApisixClientError::ConfigMissingException(name))
144}