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