1use super::{KeyRange, KeyValue};
2use crate::proto::etcdserverpb;
3use crate::ResponseHeader;
4
5#[derive(Debug)]
6pub struct RangeRequest {
7 proto: etcdserverpb::RangeRequest,
8}
9
10impl RangeRequest {
11 pub fn new(key_range: KeyRange) -> Self {
12 Self {
13 proto: etcdserverpb::RangeRequest {
14 key: key_range.key,
15 range_end: key_range.range_end,
16 limit: 0,
17 revision: 0,
18 sort_order: 0,
19 sort_target: 0,
20 serializable: false,
21 keys_only: false,
22 count_only: false,
23 min_mod_revision: 0,
24 max_mod_revision: 0,
25 min_create_revision: 0,
26 max_create_revision: 0,
27 },
28 }
29 }
30
31 pub fn limit(mut self, limit: u64) -> Self {
32 self.proto.limit = limit as i64;
33 self
34 }
35
36 pub fn revision(mut self, revision: i64) -> Self {
37 self.proto.revision = revision;
38 self
39 }
40
41 pub fn sort_by_key(mut self, order: SortOrder) -> Self {
42 self.proto.sort_target = etcdserverpb::range_request::SortTarget::Key as i32;
43 self.proto.sort_order = order.into();
44 self
45 }
46
47 pub fn sort_by_version(mut self, order: SortOrder) -> Self {
48 self.proto.sort_target = etcdserverpb::range_request::SortTarget::Version as i32;
49 self.proto.sort_order = order.into();
50 self
51 }
52}
53
54impl<T> From<T> for RangeRequest
55where
56 T: Into<KeyRange>,
57{
58 fn from(key_range: T) -> Self {
59 Self::new(key_range.into())
60 }
61}
62
63impl From<RangeRequest> for etcdserverpb::RangeRequest {
64 fn from(x: RangeRequest) -> Self {
65 x.proto
66 }
67}
68
69#[derive(Debug, Clone)]
70pub enum SortOrder {
71 Ascending,
72 Descending,
73}
74
75impl Into<etcdserverpb::range_request::SortOrder> for SortOrder {
76 fn into(self) -> etcdserverpb::range_request::SortOrder {
77 match self {
78 SortOrder::Ascending => etcdserverpb::range_request::SortOrder::Ascend,
79 SortOrder::Descending => etcdserverpb::range_request::SortOrder::Descend,
80 }
81 }
82}
83
84impl Into<i32> for SortOrder {
85 fn into(self) -> i32 {
86 let order: etcdserverpb::range_request::SortOrder = self.into();
87 order as i32
88 }
89}
90
91#[derive(Debug, Clone)]
92pub struct RangeResponse {
93 pub header: ResponseHeader,
94 pub kvs: Vec<KeyValue>,
95 pub has_more: bool,
96 pub count: u64,
97}
98
99impl From<etcdserverpb::RangeResponse> for RangeResponse {
100 fn from(proto: etcdserverpb::RangeResponse) -> Self {
101 Self {
102 header: From::from(proto.header.expect("must fetch header")),
103 kvs: proto.kvs.into_iter().map(From::from).collect(),
104 has_more: proto.more,
105 count: proto.count as u64,
106 }
107 }
108}