inve_etcd/kv/
range.rs

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}