apisix_admin_client/
config.rs

1use crate::{Result};
2use std::env;
3use std::sync::OnceLock;
4use crate::error::ApisixClientError;
5
6/// Loads the Smart ID configuration from the environment variables
7pub 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/// Apisix Client Configuration
18#[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// region: Config Builder
40/// Apisix Configuration Builder
41///
42/// Use this builder to create an Apisix Admin Configuration using a building pattern
43/// # Example
44/// ```
45/// # use apisix_admin_client::error::ApisixClientError;
46/// # type Result<T> = std::result::Result<T, ApisixClientError>;
47/// # use apisix_admin_client::config::{ApisixConfig, ApisixConfigBuilder};
48/// let cfg: Result<ApisixConfig> = ApisixConfigBuilder::new()
49///     .with_url("http://localhost:9080") // DEV environment
50///     .with_admin_url("http://localhost:9180") // DEV environment
51///     .build();
52/// ```
53#[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() //from env
65    }
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}
103// endregion: Config Builder
104
105
106/// Use this config builder for testing purposes
107impl 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
119/// Use this configuration builder
120impl 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}