use crate::discovery::ServiceInstance;
use crate::discovery_etcd::{EtcdDiscoveryConfig, EtcdDiscoveryResult};
pub fn instance_key(config: &EtcdDiscoveryConfig, service: &str, id: &str) -> String {
format!(
"{}/{}/{}",
config.prefix.trim_end_matches('/'),
service.trim_matches('/'),
id.trim_matches('/')
)
}
pub fn encode_instance(instance: &ServiceInstance) -> EtcdDiscoveryResult<Vec<u8>> {
Ok(serde_json::to_vec(instance)?)
}
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"
);
}
}