inve_etcd/kv/
put.rs

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}