1use crate::{ByteSequence, etcdserverpb};
2use etcdserverpb::PutRequest;
3
4#[derive(Debug, Clone, Default)]
5pub struct PutOptions {
6 pub lease: i64,
9
10 pub prev_kv: bool,
13
14 pub ignore_lease: bool,
17
18 pub ignore_value: bool,
21}
22
23impl PutOptions {
24 pub fn to_request(&self, key: &ByteSequence, value: &ByteSequence) -> PutRequest {
25 PutRequest {
26 key: key.to_vec(),
27 value: match self.ignore_value {
28 true => ByteSequence::empty().to_vec(),
29 false => value.to_vec(),
30 },
31 lease: self.lease,
32 prev_kv: self.prev_kv,
33 ignore_lease: self.ignore_lease,
34 ignore_value: self.ignore_value,
35 }
36 }
37
38 pub fn builder() -> PutOptionsBuilder {
39 PutOptionsBuilder::default()
40 }
41}
42
43#[derive(Debug, Clone, Default)]
44pub struct PutOptionsBuilder {
45 lease: Option<i64>,
46 prev_kv: Option<bool>,
47 ignore_lease: Option<bool>,
48 ignore_value: Option<bool>,
49}
50
51impl PutOptionsBuilder {
52 pub fn lease(mut self, lease: i64) -> Self {
53 self.lease = Some(lease);
54 self
55 }
56
57 pub fn prev_kv(mut self, prev_kv: bool) -> Self {
58 self.prev_kv = Some(prev_kv);
59 self
60 }
61
62 pub fn ignore_lease(mut self, ignore_lease: bool) -> Self {
63 self.ignore_lease = Some(ignore_lease);
64 self
65 }
66
67 pub fn ignore_value(mut self, ignore_value: bool) -> Self {
68 self.ignore_value = Some(ignore_value);
69 self
70 }
71
72 pub fn build(self) -> PutOptions {
73 let mut options = PutOptions::default();
74 if let Some(lease) = self.lease {
75 options.lease = lease;
76 }
77
78 if let Some(prev_kv) = self.prev_kv {
79 options.prev_kv = prev_kv;
80 }
81
82 if let Some(ignore_lease) = self.ignore_lease {
83 options.ignore_lease = ignore_lease;
84 }
85
86 if let Some(ignore_value) = self.ignore_value {
87 options.ignore_value = ignore_value;
88 }
89 options
90 }
91}