etcd_rs/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    /// Creates a new PutRequest for saving the specified key-value.
13    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    /// Sets the lease ID to associate with the key in the key-value store.
31    /// A lease value of 0 indicates no lease.
32    pub fn lease(mut self, lease: LeaseId) -> Self {
33        self.proto.lease = lease as i64;
34        self
35    }
36
37    /// When set, responds with the key-value pair data before the update from this Put request.
38    pub fn prev_kv(mut self, prev_kv: bool) -> Self {
39        self.proto.prev_kv = prev_kv;
40        self
41    }
42
43    /// When set, update the key without changing its current value. Returns an error if the key does not exist.
44    pub fn ignore_value(mut self) -> Self {
45        self.proto.ignore_value = true;
46        self
47    }
48
49    /// When set, update the key without changing its current lease. Returns an error if the key does not exist.
50    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}