1use crate::proto::etcdserverpb;
2use crate::proto::etcdserverpb::watch_request::RequestUnion;
3use crate::{Event, KeyRange, ResponseHeader};
4
5#[derive(Debug)]
6pub struct WatchCreateRequest {
7 proto: crate::proto::etcdserverpb::WatchCreateRequest,
8}
9
10impl WatchCreateRequest {
11 pub fn create(key_range: KeyRange) -> Self {
12 Self {
13 proto: etcdserverpb::WatchCreateRequest {
14 key: key_range.key,
15 range_end: key_range.range_end,
16 start_revision: 0,
17 progress_notify: false,
18 filters: vec![],
19 prev_kv: false,
20 fragment: false,
21 watch_id: 0,
22 },
23 }
24 }
25
26 pub fn start_revision(mut self, revision: i64) -> Self {
27 self.proto.start_revision = revision;
28 self
29 }
30
31 pub fn progress_notify(mut self) -> Self {
32 self.proto.progress_notify = true;
33 self
34 }
35
36 pub fn prev_kv(mut self) -> Self {
37 self.proto.prev_kv = true;
38 self
39 }
40}
41impl Into<etcdserverpb::WatchCreateRequest> for WatchCreateRequest {
42 fn into(self) -> etcdserverpb::WatchCreateRequest {
43 self.proto
44 }
45}
46
47impl Into<etcdserverpb::WatchRequest> for WatchCreateRequest {
48 fn into(self) -> etcdserverpb::WatchRequest {
49 etcdserverpb::WatchRequest {
50 request_union: Some(RequestUnion::CreateRequest(self.into())),
51 }
52 }
53}
54
55impl From<KeyRange> for WatchCreateRequest {
56 fn from(key_range: KeyRange) -> Self {
57 Self::create(key_range)
58 }
59}
60
61#[derive(Debug, Clone)]
62pub struct WatchCancelRequest {
63 proto: etcdserverpb::WatchCancelRequest,
64}
65
66impl WatchCancelRequest {
67 pub fn new(watch_id: i64) -> Self {
68 Self {
69 proto: etcdserverpb::WatchCancelRequest { watch_id },
70 }
71 }
72}
73
74impl From<i64> for WatchCancelRequest {
75 fn from(watch_id: i64) -> Self {
76 Self::new(watch_id)
77 }
78}
79
80impl Into<etcdserverpb::WatchCancelRequest> for WatchCancelRequest {
81 fn into(self) -> etcdserverpb::WatchCancelRequest {
82 self.proto
83 }
84}
85
86impl Into<etcdserverpb::WatchRequest> for WatchCancelRequest {
87 fn into(self) -> etcdserverpb::WatchRequest {
88 etcdserverpb::WatchRequest {
89 request_union: Some(RequestUnion::CancelRequest(self.into())),
90 }
91 }
92}
93
94#[derive(Debug, Clone)]
95pub struct WatchResponse {
96 pub header: ResponseHeader,
97 pub watch_id: i64,
98 pub created: bool,
99 pub canceled: bool,
100 pub events: Vec<Event>,
101}
102
103impl From<etcdserverpb::WatchResponse> for WatchResponse {
104 fn from(proto: etcdserverpb::WatchResponse) -> Self {
105 Self {
106 header: From::from(proto.header.expect("must fetch header")),
107 watch_id: proto.watch_id,
108 created: proto.created,
109 canceled: proto.canceled,
110 events: proto.events.into_iter().map(From::from).collect(),
111 }
112 }
113}