use crate::discovery::{Discovery, DiscoveryError, DiscoveryResult, Registry, ServiceInstance};
use async_trait::async_trait;
use crate::discovery_etcd::{EtcdDiscoveryConfig, instance_key};
#[derive(Debug, Clone)]
pub struct EtcdRegistry {
config: EtcdDiscoveryConfig,
fallback: crate::discovery::MemoryRegistry,
}
impl EtcdRegistry {
pub fn new(config: EtcdDiscoveryConfig) -> Self {
Self {
config,
fallback: crate::discovery::MemoryRegistry::new(),
}
}
pub fn key_for(&self, instance: &ServiceInstance) -> String {
instance_key(&self.config, &instance.service, &instance.id)
}
}
#[async_trait]
impl Discovery for EtcdRegistry {
async fn discover(&self, service: &str) -> DiscoveryResult<Vec<ServiceInstance>> {
self.fallback.discover(service).await
}
}
#[async_trait]
impl Registry for EtcdRegistry {
async fn register(&self, instance: ServiceInstance) -> DiscoveryResult<()> {
self.fallback.register(instance).await
}
async fn deregister(&self, service: &str, id: &str) -> DiscoveryResult<ServiceInstance> {
self.fallback
.deregister(service, id)
.await
.map_err(|_| DiscoveryError::MissingInstance {
service: service.to_string(),
id: id.to_string(),
})
}
}