use std::time::Duration;
use serde_json::Value;
use serde::{Deserialize, Serialize};
use tokio::time::sleep;
use async_trait::async_trait;
use from_value_derive::From;
use serde_json::Map;
use to_url::ToUrl;
use crate::parse_url::ParseUrl;
use crate::client::{CLIENT, REQ_CLIENT};
use crate::result::Result;
const BEAT: &str = "/nacos/v1/ns/instance/beat";
#[allow(non_snake_case)]
#[derive(Debug, Default, Clone, Deserialize, Serialize, ToUrl)]
pub struct Beat{
pub serviceName: String,
pub ip: String,
pub port: String,
pub namespaceId: Option<String>,
pub groupName: Option<String>,
pub ephemeral: Option<bool>,
pub beat: Option<BeatInfo>,
}
#[async_trait]
impl ParseUrl for Beat {}
impl Beat {
pub async fn beat(&self) -> Result<String> {
let url = self.parse_url(BEAT).await;
tokio::spawn(Self::send_beat(url));
Ok("ok".to_string())
}
async fn send_beat(url: String) -> Result<()>{
let interval;
{
interval = CLIENT.read().await.client_beat_interval;
};
loop {
sleep(Duration::from_secs(interval)).await;
let _ok:BeatRes = REQ_CLIENT.put(&url).send().await?.json().await?;
}
}
}
#[allow(non_snake_case)]
#[derive(Debug, Default, Clone, Deserialize, Serialize, From)]
pub struct BeatInfo{
pub serviceName: String,
pub ip: String,
pub port: String,
pub namespaceId: Option<String>,
pub cluster: Option<String>,
pub weight: Option<f64>,
pub metadata: Option<String>,
pub period: u64,
pub scheduled: bool,
pub instanceId: String,
}
#[allow(non_snake_case)]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct BeatRes {
pub clientBeatInterval: i64,
pub code: i64,
pub lightBeatEnabled: bool,
}