etcd-rs 1.0.1

etcd client for rust
Documentation
mod member_add;
mod member_list;
mod member_remove;
mod member_update;

pub use member_add::{MemberAddRequest, MemberAddResponse};
pub use member_list::{MemberListRequest, MemberListResponse};
pub use member_remove::{MemberRemoveRequest, MemberRemoveResponse};
pub use member_update::{MemberUpdateRequest, MemberUpdateResponse};

use async_trait::async_trait;

use crate::proto::etcdserverpb;
use crate::Result;

#[async_trait]
pub trait ClusterOp {
    async fn member_add<R>(&self, req: R) -> Result<MemberAddResponse>
    where
        R: Into<MemberAddRequest> + Send;

    async fn member_remove<R>(&self, req: R) -> Result<MemberRemoveResponse>
    where
        R: Into<MemberRemoveRequest> + Send;

    async fn member_update<R>(&self, req: R) -> Result<MemberUpdateResponse>
    where
        R: Into<MemberUpdateRequest> + Send;

    async fn member_list(&self) -> Result<MemberListResponse>;
}

#[derive(Debug, Clone)]
pub struct Member {
    pub id: u64,
    pub name: String,
    pub peer_urls: Vec<String>,
    pub client_urls: Vec<String>,
    pub is_learner: bool,
}

impl From<etcdserverpb::Member> for Member {
    fn from(proto: etcdserverpb::Member) -> Self {
        Self {
            id: proto.id,
            name: proto.name,
            peer_urls: proto.peer_ur_ls,
            client_urls: proto.client_ur_ls,
            is_learner: proto.is_learner,
        }
    }
}

impl Into<etcdserverpb::Member> for Member {
    fn into(self) -> etcdserverpb::Member {
        etcdserverpb::Member {
            id: self.id,
            name: self.name,
            peer_ur_ls: self.peer_urls,
            client_ur_ls: self.client_urls,
            is_learner: self.is_learner,
        }
    }
}