use std::net::SocketAddr;
use async_trait::async_trait;
use luoshu_configuration::Configurator;
use luoshu_core::default_namespace;
use luoshu_namespace::Namespace;
use luoshu_registry::{Registry, Service};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::data::{Frame, Subscribe};
use anyhow::Result;
use tokio::sync::mpsc::UnboundedSender;
#[derive(Clone, Deserialize, Serialize, Debug)]
pub struct ServiceReg {
#[serde(default = "default_namespace")]
namespace: String,
name: String,
#[serde(flatten)]
service: Service,
}
impl ServiceReg {
pub fn new(namespace: String, name: String, service: Service) -> Self {
Self {
namespace,
name,
service,
}
}
}
impl From<&ServiceReg> for Registry {
fn from(service_reg: &ServiceReg) -> Self {
let mut registry = Registry::new(
Some(service_reg.namespace.clone()),
service_reg.name.clone(),
);
registry
.register_service(service_reg.service.clone())
.unwrap();
registry
}
}
#[derive(Clone, Deserialize, Serialize, Debug)]
pub struct ConfigurationReg {
#[serde(default = "default_namespace")]
namespace: String,
pub(crate) name: String,
pub config: Value,
}
impl From<&ConfigurationReg> for Configurator {
fn from(configuration_reg: &ConfigurationReg) -> Self {
let mut configuration = Configurator::new(Some(configuration_reg.namespace.clone()));
configuration
.set_configuration(
configuration_reg.name.clone(),
configuration_reg.config.clone(),
)
.unwrap();
configuration
}
}
impl ConfigurationReg {
pub fn new(namespace: String, name: String, config: Value) -> Self {
Self {
namespace,
name,
config,
}
}
pub fn get_namespace(&self) -> String {
self.namespace.clone()
}
pub fn get_subscribe_str(&self) -> String {
format!("{}|{}", self.namespace.clone(), self.name.clone())
}
}
#[derive(Clone, Deserialize, Serialize, Debug)]
pub struct NamespaceReg {
name: String,
}
impl NamespaceReg {
pub fn new(name: String) -> Self {
Self { name }
}
}
impl From<&NamespaceReg> for Namespace {
fn from(namespace_reg: &NamespaceReg) -> Self {
Namespace::new(namespace_reg.name.clone())
}
}
#[derive(Clone, Serialize, Deserialize, Debug)]
pub enum LuoshuDataEnum {
Namespace(NamespaceReg),
Configuration(ConfigurationReg),
Service(ServiceReg),
Subscribe(String),
}
impl From<NamespaceReg> for LuoshuDataEnum {
fn from(namespace: NamespaceReg) -> Self {
Self::Namespace(namespace)
}
}
impl From<ConfigurationReg> for LuoshuDataEnum {
fn from(configuration: ConfigurationReg) -> Self {
Self::Configuration(configuration)
}
}
impl From<ServiceReg> for LuoshuDataEnum {
fn from(service: ServiceReg) -> Self {
Self::Service(service)
}
}
#[derive(Clone, Serialize, Deserialize, Debug)]
pub enum LuoshuSyncDataEnum {
Namespace(Vec<Namespace>),
Configuration(Vec<Configurator>),
Registry(Vec<Registry>),
LuoshuData(LuoshuDataEnum),
}
impl From<LuoshuDataEnum> for LuoshuSyncDataEnum {
fn from(data: LuoshuDataEnum) -> Self {
Self::LuoshuData(data)
}
}
impl From<Vec<Namespace>> for LuoshuSyncDataEnum {
fn from(data: Vec<Namespace>) -> Self {
Self::Namespace(data)
}
}
impl From<Vec<Configurator>> for LuoshuSyncDataEnum {
fn from(data: Vec<Configurator>) -> Self {
Self::Configuration(data)
}
}
impl From<Vec<Registry>> for LuoshuSyncDataEnum {
fn from(data: Vec<Registry>) -> Self {
Self::Registry(data)
}
}
#[async_trait]
pub trait LuoshuDataHandle {
async fn append(
&mut self,
value: &LuoshuDataEnum,
client: Option<SocketAddr>,
sender: Option<&UnboundedSender<Frame>>,
) -> Result<()>;
async fn remove(&mut self, value: &LuoshuDataEnum) -> Result<()>;
async fn sync(&mut self, value: &LuoshuSyncDataEnum) -> Result<()>;
async fn subscribe(
&mut self,
subscribe: Subscribe,
subscriber_sender: &UnboundedSender<Frame>,
) -> Result<()>;
async fn broken(&mut self, client: SocketAddr) -> Result<()>;
}
pub trait LuoshuDataServiceHandle {
fn get_service(&mut self, name: String, namespace: Option<String>) -> Vec<Service>;
}