detcd 0.1.4

An etcd-based implementation of service registration and discovery.
Documentation
use detector::{Meta, Service, ServiceKey, Services};
use std::collections::HashMap;

/// 解析meta回包
pub(crate) fn parse_meta_response(resp: etcd_client::GetResponse) -> Vec<Meta> {
    let revision = Some(resp.header().unwrap().revision());
    let mut metas = vec![];

    for kv in resp.kvs() {
        let mut res = serde_json::from_slice::<Meta>(kv.value());
        res = res.map(|mut m| {
            m.revision = revision;
            m
        });

        if res.is_ok() {
            metas.push(res.unwrap());
        }
    }
    metas
}

/// 解析service回包
pub(crate) fn parse_service_response(resp: etcd_client::GetResponse) -> HashMap<String, Services> {
    let revision = Some(resp.header().unwrap().revision());
    let mut hm = HashMap::new();

    for kv in resp.kvs() {
        let key = ServiceKey::try_from(kv.key());
        if key.is_ok() {
            let mut value = serde_json::from_slice::<Service>(kv.value());
            value = value.map(|mut m| {
                m.revision = revision;
                m
            });

            if value.is_ok() {
                let name = key.unwrap().name;
                let services = match hm.get_mut(&name) {
                    Some(s) => s,
                    None => {
                        hm.insert(name.clone(), Services::new());
                        hm.get_mut(&name).unwrap()
                    }
                };
                services.services.push(value.unwrap());
            }
        }
    }
    hm
}