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