rs-zero 0.1.1

Rust-first microservice framework inspired by go-zero engineering practices
Documentation
use crate::discovery::{Discovery, DiscoveryError, DiscoveryResult, Registry, ServiceInstance};
use async_trait::async_trait;

use crate::discovery_etcd::{EtcdDiscoveryConfig, instance_key};

/// etcd registry adapter facade.
#[derive(Debug, Clone)]
pub struct EtcdRegistry {
    config: EtcdDiscoveryConfig,
    fallback: crate::discovery::MemoryRegistry,
}

impl EtcdRegistry {
    /// Creates an adapter facade.
    pub fn new(config: EtcdDiscoveryConfig) -> Self {
        Self {
            config,
            fallback: crate::discovery::MemoryRegistry::new(),
        }
    }

    /// Returns the etcd key for an instance.
    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(),
            })
    }
}