1mod member_add;
2mod member_list;
3mod member_remove;
4mod member_update;
5
6pub use member_add::{MemberAddRequest, MemberAddResponse};
7pub use member_list::{MemberListRequest, MemberListResponse};
8pub use member_remove::{MemberRemoveRequest, MemberRemoveResponse};
9pub use member_update::{MemberUpdateRequest, MemberUpdateResponse};
10
11use async_trait::async_trait;
12
13use crate::proto::etcdserverpb;
14use crate::Result;
15
16#[async_trait]
17pub trait ClusterOp {
18 async fn member_add<R>(&self, req: R) -> Result<MemberAddResponse>
19 where
20 R: Into<MemberAddRequest> + Send;
21
22 async fn member_remove<R>(&self, req: R) -> Result<MemberRemoveResponse>
23 where
24 R: Into<MemberRemoveRequest> + Send;
25
26 async fn member_update<R>(&self, req: R) -> Result<MemberUpdateResponse>
27 where
28 R: Into<MemberUpdateRequest> + Send;
29
30 async fn member_list(&self) -> Result<MemberListResponse>;
31}
32
33#[derive(Debug, Clone)]
34pub struct Member {
35 pub id: u64,
36 pub name: String,
37 pub peer_urls: Vec<String>,
38 pub client_urls: Vec<String>,
39 pub is_learner: bool,
40}
41
42impl From<etcdserverpb::Member> for Member {
43 fn from(proto: etcdserverpb::Member) -> Self {
44 Self {
45 id: proto.id,
46 name: proto.name,
47 peer_urls: proto.peer_ur_ls,
48 client_urls: proto.client_ur_ls,
49 is_learner: proto.is_learner,
50 }
51 }
52}
53
54impl Into<etcdserverpb::Member> for Member {
55 fn into(self) -> etcdserverpb::Member {
56 etcdserverpb::Member {
57 id: self.id,
58 name: self.name,
59 peer_ur_ls: self.peer_urls,
60 client_ur_ls: self.client_urls,
61 is_learner: self.is_learner,
62 }
63 }
64}