rs-zero 0.1.1

Rust-first microservice framework inspired by go-zero engineering practices
Documentation
use crate::discovery::ServiceInstance;

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

/// Builds the etcd key for one service instance.
pub fn instance_key(config: &EtcdDiscoveryConfig, service: &str, id: &str) -> String {
    format!(
        "{}/{}/{}",
        config.prefix.trim_end_matches('/'),
        service.trim_matches('/'),
        id.trim_matches('/')
    )
}

/// Encodes an instance as JSON.
pub fn encode_instance(instance: &ServiceInstance) -> EtcdDiscoveryResult<Vec<u8>> {
    Ok(serde_json::to_vec(instance)?)
}

/// Decodes an instance from JSON.
pub fn decode_instance(value: &[u8]) -> EtcdDiscoveryResult<ServiceInstance> {
    Ok(serde_json::from_slice(value)?)
}

#[cfg(test)]
mod tests {
    use crate::discovery::{InstanceEndpoint, ServiceInstance};

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

    #[test]
    fn codec_round_trips_service_instance() {
        let instance = ServiceInstance::new(
            "api",
            "api-1",
            InstanceEndpoint::new("127.0.0.1", 8080).expect("endpoint"),
        )
        .with_metadata("zone", "local");
        let value = encode_instance(&instance).expect("encode");
        assert_eq!(decode_instance(&value).expect("decode"), instance);
        assert_eq!(
            instance_key(&EtcdDiscoveryConfig::default(), "api", "api-1"),
            "/rs-zero/api/api-1"
        );
    }
}