nacos_api/integration/
configs.rs1use crate::{NacosConfigApi, NacosConfig, DeployConfig};
2use tokio::task;
3use tokio::time;
4use std::time::Duration;
5
6#[derive(Clone)]
9pub struct NacosConfigClient {
10 config_api: NacosConfigApi,
11}
12
13impl NacosConfigClient {
14 pub fn new(data_id: &str, group: &str, tenant: Option<String>) -> Self
15 { Self { config_api: NacosConfigApi::new(DeployConfig::new(data_id, group, tenant)) } }
16 pub fn from(config_api: NacosConfigApi) -> Self { Self { config_api } }
17 pub fn config_api(&self) -> &NacosConfigApi { &self.config_api }
18}
19
20impl NacosConfigClient {
21 pub async fn listen_config<F>(&self, nacos_config: &NacosConfig, func: F, interval_secs: u64)
38 where F: Fn(&String) + Send + 'static
39 {
40 task::spawn(listen(
41 self.config_api.clone(),
42 nacos_config.clone(),
43 func,
44 interval_secs,
45 )).await.unwrap()
46 }
47}
48
49async fn listen<F>(config_api: NacosConfigApi, nacos_config: NacosConfig, func: F, interval_secs: u64)
50 where F: Fn(&String)
51{
52 let prev_conf = config_api.get_configs(&nacos_config).await.unwrap();
53 let mut prev_conf_md5 = format!("{:x}", md5::compute(prev_conf));
54 println!(" -- [debug] starting listen configs");
55 loop {
56 time::sleep(Duration::from_secs(interval_secs)).await;
57 let current_conf = config_api.get_configs(&nacos_config).await.unwrap();
58 let current_conf_md5 = format!("{:x}", md5::compute(¤t_conf));
59 if prev_conf_md5.ne(¤t_conf_md5) {
60 func(¤t_conf);
61 prev_conf_md5 = current_conf_md5;
62 }
63 }
64}