1use super::KeyValue;
2use crate::lease::LeaseId;
3use crate::proto::etcdserverpb;
4use crate::ResponseHeader;
5
6#[derive(Debug)]
7pub struct PutRequest {
8 proto: etcdserverpb::PutRequest,
9}
10
11impl PutRequest {
12 pub fn new<K, V>(key: K, value: V) -> Self
13 where
14 K: Into<Vec<u8>>,
15 V: Into<Vec<u8>>,
16 {
17 Self {
18 proto: etcdserverpb::PutRequest {
19 key: key.into(),
20 value: value.into(),
21 lease: 0,
22 prev_kv: false,
23 ignore_value: false,
24 ignore_lease: false,
25 },
26 }
27 }
28
29 pub fn lease(mut self, lease: LeaseId) -> Self {
30 self.proto.lease = lease as i64;
31 self
32 }
33
34 pub fn prev_kv(mut self, prev_kv: bool) -> Self {
35 self.proto.prev_kv = prev_kv;
36 self
37 }
38
39 pub fn ignore_value(mut self) -> Self {
40 self.proto.ignore_value = true;
41 self
42 }
43
44 pub fn ignore_lease(mut self) -> Self {
45 self.proto.ignore_lease = true;
46 self
47 }
48}
49
50impl From<PutRequest> for etcdserverpb::PutRequest {
51 fn from(x: PutRequest) -> Self {
52 x.proto
53 }
54}
55
56impl<K, V> From<(K, V)> for PutRequest
57where
58 K: Into<Vec<u8>>,
59 V: Into<Vec<u8>>,
60{
61 fn from(kv: (K, V)) -> Self {
62 Self::new(kv.0, kv.1)
63 }
64}
65
66#[derive(Debug, Clone)]
67pub struct PutResponse {
68 pub header: ResponseHeader,
69 pub prev_kv: KeyValue,
70}
71
72impl From<etcdserverpb::PutResponse> for PutResponse {
73 fn from(proto: etcdserverpb::PutResponse) -> Self {
74 Self {
75 header: From::from(proto.header.expect("must fetch header")),
76 prev_kv: From::from(proto.prev_kv.unwrap_or(Default::default())),
77 }
78 }
79}